pygame实现非图片按钮效果

  

本文实例为大家分享了pygame实现非图片按钮效果的具体代码,供大家参考,具体内容如下

  

按钮类程序

        # - * -编码utf - 8=- *   进口线程   进口pygame   pygame。当地进口MOUSEBUTTONDOWN      类BFControlId(对象):   _instance_lock=threading.Lock ()   def __init__(自我):   自我。id=1      @classmethod   def实例(cls * args, * * kwargs):   如果不是hasattr (BFControlId“_instance”):   BFControlId。_instance=BFControlId (* args, * * kwargs)   返回BFControlId._instance      def get_new_id(自我):   自我。id +=1   返回self.id      CLICK_EFFECT_TIME=100   类BFButton(对象):   def __init__(自我、父母、矩形、文本=鞍磁ァ?点击=None):   self.x、self.y self.width,自我。身高=矩形   自我。bg_color=(225225225)   自我。父母=父   自我。表面=parent.subsurface(矩形)   自我。is_hover=False   自我。in_click=False   自我。click_loss_time=0   自我。click_event_id=1   自我。.get_new_id .instance ctl_id=BFControlId () () ()   自我。_text=文本   自我。form1=点击   自我。_visible=True   self.init_font ()      def init_font(自我):   字体=pygame.font。字体(没有,28)   白色=100,100,100   自我。textImage=font.render(自我。_text,真的,白色)   w h=self.textImage.get_size ()   自我。_tx=(自我。宽度- w)/2   自我。_ty=(自我。高度- h)/2         @ property   def文本(自我):   返回self._text      @text.setter   def文本(自我价值):   自我。_text=值   self.init_font ()      @ property   def点击(自我):   返回self._click      @click.setter   def点击(自我价值):   自我。form1=值      @ property   def可见(自我):   返回self._visible      @visible.setter   def可见(自我价值):   自我。_visible=值      def更新(自我、事件):   如果自我。in_click和事件。类型==self.click_event_id:   如果自我。form1: self._click(自我)   自我。click_event_id=1   返回      x, y=pygame.mouse.get_pos ()   如果x比;自我。x, x & lt;自我。x +自我。宽度和y比;自我。y、y & lt;自我。y + self.height:   自我。is_hover=True   如果事件。类型==MOUSEBUTTONDOWN:   pressed_array=pygame.mouse.get_pressed ()   如果pressed_array [0]:   自我。in_click=True   自我。click_loss_time=pygame.time.get_ticks () + CLICK_EFFECT_TIME   自我。click_event_id=pygame.USEREVENT + self.ctl_id   pygame.time.set_timer (self.click_event_id CLICK_EFFECT_TIME-10)   其他:   自我。is_hover=False      def画(自我):   如果self.in_click:   如果自我。click_loss_time & lt;pygame.time.get_ticks ():   自我。in_click=False   如果不是self._visible:   返回   如果self.in_click:   r, g, b=self.bg_color   k=0.95   self.surface。填充((r * k, g * k b * k))   其他:   self.surface.fill (self.bg_color)   如果self.is_hover:   pygame.draw.rect(自我。表面上看,(0,0,0),(0,0,self.width self.height), 1)   pygame.draw.rect(自我。表面上看,(100100100),(0,0,self.width-1 self.height-1), 1)   层=5   r_step=(210 - 170)/层   g_step=(225 - 205)/层   因为我在范围(层):   pygame.draw.rect(自我。表面,(170 + r_step *我,205 + g_step *我,255),(我,我,自我。宽度- 2 * 2,自我。高度- 2我* 2),1)   其他:   self.surface.fill (self.bg_color)   pygame.draw.rect(自我。表面上看,(0,0,0),(0,0,self.width self.height), 1)   pygame.draw.rect(自我。表面上看,(100100100),(0,0,self.width-1 self.height-1), 1)   pygame.draw.rect(自我。表面上看,自我。bg_color (0, 0, self.width-2 self.height-2), 1)      self.surface.blit(自我。textImage(自我。_tx, self._ty))      

<强>主要给按钮实现了:

  

1。鼠标悬停效果
  2.按钮点击效果
  3.文本绘制效果
  4.点击后事件触发效果
  5 .按钮的隐藏和显示控制

  

<强>使用方法:

  

btn=BFButton (=my_label my_surface my_rect,文本,单击=my_method)
  在事件响应处
  btn.update(事件)
  在绘图处
  btn.draw ()
  

  

下面附一个例子

        # - * -编码utf - 8=- *   进口pygame   从bf_button进口BFButton      pygame.init ()   screencaption=pygame.display。set_caption(“高炉控制”)   屏幕=pygame.display.set_mode ((400400))      def do_click1 (btn):   pygame.display。set_caption(“我点击% s, ctl id是% s的% (btn._text btn.ctl_id))   btn。文本='是点击“      def do_click2 (btn):   btn。可见=False      def do_click3 (btn):   pygame.quit ()   退出()      button1=BFButton(屏幕,(120100160年,40))   button1。文本='玩'   button1。单击=do_click1   button2=BFButton(屏幕,(120180160年,40),文本=耙亍?单击=do_click2)   button3=BFButton(屏幕,(120260160年,40),文本=按侵啊?单击=do_click3)      而真正的:   在pygame.event.get事件():   如果事件。类型==pygame.QUIT:   pygame.quit ()   退出()   button1.update(事件)   button2.update(事件)   button3.update(事件)      screen.fill ((255255255))   button1.draw ()   button2.draw ()   button3.draw ()      pygame.display.update ()

pygame实现非图片按钮效果