我正在使用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()
答案 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()函数不会冒泡到多个实例。