Kivy Python右键单击

Dam*_*ara 5 python minesweeper kivy

我正在使用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()
Run Code Online (Sandbox Code Playgroud)

hur*_*urk 6

您应该绑定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")
    ...
Run Code Online (Sandbox Code Playgroud)