Kivy Python右击

时间:2017-06-12 05:24:51

标签: python kivy minesweeper

我正在使用Button小部件与Kivy一起制作扫雷游戏。我希望能够有不同的操作,具体取决于鼠标单击是鼠标左键还是鼠标右键单击。有谁能够帮我?

下面是我的Cell类和导入的模块。

请注意,Cell.onPressed()是按下按钮时调用的函数。

import kivy
from kivy.config import Config

Config.set('input', 'mouse', 'mouse,disable_multitouch')

from random import randint
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.anchorlayout import AnchorLayout

width = 10
height = 10
bombs = 5
size = 60

class Cell():  

  def __init__(self):
    self.isBomb = False
    self.isVisible = False
    self.neighbors = None
    self.location = []
    self.button = Button(size = (size, size), size_hint = (None, None))
    self.button.bind(on_press = self.onPressed)

  def build(self, x, y):
    self.location = [x, y]
    self.count_neighbors()

  def onPressed(self, instance):
    #if left_click == True:    
    self.isVisible = True
    self.button.text = str(self.neighbors)
    if self.neighbors == 0:
      for i in range(-1, 2):
        for j in range(-1, 2):
          if (0 <= self.location[0] + i < width) and (0 <= self.location[1] + j < height):
            if grid[self.location[0] + i][self.location[1] + j].isVisible == False:
              grid[self.location[0] + i][self.location[1] + j].onPressed(instance)    
    #if right_click == True:
      #Toggle state


  def count_neighbors(self):
    if self.isBomb == False:
      count = 0
      for i in range(-1, 2):
        for j in range(-1, 2):
          if (0 <= self.location[0] + i < width) and (0 <= self.location[1] + j < height):
            if grid[self.location[0] + i][self.location[1] + j].isBomb == True:
              count += 1
      self.neighbors = count

class TestApp(App):

  def build(self):
    root = AnchorLayout(anchor_x = 'center', anchor_y = 'center')
    grid_root = RelativeLayout(size = (width * size, height * size), size_hint = (None, None))
    layout = []
    for i in range(height):
      layout.append(BoxLayout(orientation='horizontal', size_hint = (.8, .8), pos = (0, (height - 1) * size - i * size)))
      for j in range(width):    
        layout[i].add_widget(grid[j][i].button)    
      grid_root.add_widget(layout[i])
    root.add_widget(grid_root)
    return root


def init_grid():
  global grid
  grid = [[Cell() for x in range(width)] for y in range(height)]
  for _ in range(bombs):
    while True:
      x = randint(0, height - 1)
      y = randint(0, width - 1)
      if grid[x][y].isBomb == False:
        grid[x][y].isBomb = True
        break  
  for i in range(width):
    for j in range(height):
      grid[j][i].build(j, i)


if __name__ == '__main__':
  init_grid()
  TestApp().run()

3 个答案:

答案 0 :(得分:4)

您应该绑定on_touch_down而不是on_press,以便可以使用touch参数:

...
self.button.bind(on_touch_down = self.onPressed)
...

def onPressed(self, instance, touch):
    if touch.button == 'right':
        print("right mouse clicked")
    ...

答案 1 :(得分:1)

我得到了一些工作,虽然有点骇人听闻。 我创建了一个继承自Widget的新类,只是更改了一个名为'mouse'的全局变量

class TouchInput(Widget):

  def on_touch_down(self, touch):
    global mouse
    mouse = touch.button

我创建了一个TouchInput()实例并将其添加到我的根布局

class TestApp(App):

  def build(self):
    root = AnchorLayout(anchor_x = 'center', anchor_y = 'center')
    root_input = TouchInput()
    grid_root = RelativeLayout(size = (width * size, height * size), size_hint = (None, None))
    layout = []
    for i in range(height):
      layout.append(BoxLayout(orientation='horizontal', size_hint = (.8, .8), pos = (0, (height - 1) * size - i * size)))
      for j in range(width):    
        layout[i].add_widget(grid[j][i].button)    
      grid_root.add_widget(layout[i])
    root.add_widget(grid_root)
    root.add_widget(root_input)
    return(root)

现在,只要按下按钮,就可以检查是右键还是左键。

def onPressed(self, instance):
  if mouse == 'left':
    print('Left!')
  if mouse == 'right':
    print('Right!')

答案 2 :(得分:0)

通过创建一个新的类,我能够知道按下了什么按钮:

from kivy.uix.button import Button 
class ClickableButton(Button):
    def __init__(self,**kwargs):
        super(Button, self).__init__(**kwargs)
        self.mouse_button = None #mouse_button records what button is pressed
        self.bind(on_touch_down = self.callback_touch_down) #set up a function to be called on mouse events
    def callback_touch_down(self, instance, touch):
        self.mouse_button = touch.button #record what button is clicked on touch down on mouse events

ClickableButton类继承自Button,因此可以像普通的按钮一样使用,如下所示:

from kivy.app import App
def callback(instance):
    print('The <%s> button is being pressed' % instance.mouse_button)

class MyApp(App):  
    def build(self):  
        return ClickableButton(text = "ClickableButton",on_press = callback)

if __name__ == '__main__':
    root = MyApp().run()

现在,程序知道按下了哪些特定的kivy按钮,以及单击了哪些鼠标按钮。同样,Button.on_touch_down()函数不会冒泡到多个实例。