Tkinter: Identifizierung der Schaltfläche nach Zeile und Spalte

Ich möchte in der Lage sein, eine Schaltfläche auszuwählen, die darauf basiert, welche Zeile und Spalte es in einem Raster und der Schaltfläche ist und steuert deren Text und Relief. Ich habe nicht in der Lage, etwas auf Widgets oder Zellen auf diese Weise verwendet zu finden. Edit: Ich habe gewechselt, wo Wurzel platziert ist und nun heißt es, dass ich kein Tupel benutzen kann, das ich für "Relief" empfing, was sinnvoll ist, ich muss das Widget selbst aufrufen. Jede Empfehlung

import tkinter import functools import random from time import sleep width = input('Enter the grid width. ') height = input('Enter the grid height. ') numb = input('Enter the number of bombs. ') Matrix = [[0 for lp in range(int(width))] for fg in range(int(height))] def ranintx(): return random.randint(0,int(width)) def raninty(): return random.randint(0,int(height)) def placemines(): y = ranintx() x = raninty() for ranintformine in range(int(numb)): x = ranintx() y = raninty() Matrix[y-1][x-1] = 1 placemines() def sunken(event, self, x, y): button = event.widget button['relief'] = 'sunken' if x - 1 < 0 : return if x > int(width) + 1 : return if y - 1 < 0 : return if y > int(height) + 1 : return if Matrix[x][y] == 1 : top = tkinter.Toplevel() top.title("About this application...") msg = tkinter.Message(top, text="You Lose") msg.pack() button = tkinter.Button(top, text="Dismiss", command=top.destroy) button.pack() print('Column = {}\nRow = {}'.format(x, y)) else: n1 = x - 1 n2 = y - 1 for lp in range(3): for lp2 in range(3): abutton = root.grid_location(n1, n2) abutton['relief'] = ['sunken'] # I want to be able to change and select the button here. This was one of my poor attempt n2 =+ 1 n1 =+ 1 def push(event, self, x, y): button = event.widget if Matrix[x][y] == 1 : print('Column = {}\nRow = {}'.format(x, y)) class MineSweep(tkinter.Frame): @classmethod def main(cls, width, height): window = cls(root, width, height) '''placemine()''' root.mainloop() def __init__(self, master, width, height): super().__init__(master) self.__width = width self.__height = height self.__build_buttons() self.grid() #def sunken(event): # button = event.widget # button['relief'] = 'sunken' def __build_buttons(self): self.__buttons = [] for y in range(self.__height): row = [] for x in range(self.__width): button = tkinter.Button(self, state='disabled') button.grid(column=x, row=y) button['text'] = ' ' print(grid.slaves) self.checked = True #button['command'] = functools.partial(self.__push, x, y) button.bind("<Button-3>", lambda event, arg=x, brg=y: push(event, self, arg, brg)) button['relief'] = 'raised' button.bind("<Button-1>", lambda event, arg=x, brg=y: sunken(event, self, arg, brg)) #button['command'] = sunken row.append(button) self.__buttons.append(row) root = tkinter.Tk() if __name__ == '__main__': MineSweep.main(int(width), int(height)) 

One Solution collect form web for “Tkinter: Identifizierung der Schaltfläche nach Zeile und Spalte”

Sie haben ein paar Dinge falsch mit Ihrem Programm. Zuerst sollte sunken eine Methode auf der Klasse sein. Es ist sehr komisch, es außerhalb der Klasse zu haben, und dann passierst du in sich self als irgendein anderes Argument. Es funktioniert, aber es macht den Code sehr verwirrend.

Das heißt, du bist eigentlich sehr nahe daran, diese Arbeit zu machen. Sie speichern bereits einen Verweis auf jede Schaltfläche in einer Liste von Listen, also sollten Sie in der Lage sein, das Widget mit self.__buttons[y][x] zu bekommen self.__buttons[y][x] . Allerdings , weil sunken ist nicht Teil der Klasse, und weil Sie die Variable mit zwei Unterstrichen benannt, ist die Variable nicht zugänglich für die sunken Funktion.

Wenn Sie die Variable ändern, um einen einzigen Unterstrich anstelle eines Doppels zu haben, sollte Ihr Code mehr oder weniger genau so funktionieren, wie es ist (sobald Sie die Syntax- und Einrückungsfehler beheben). Die andere Lösung ist, eine Methode auf der Klasse zu machen und zu beheben, wie du es nennst (entferne das Selbst-Argument, nenn es als self.sunken ), es wird mit zwei Unterstrichen arbeiten.

Ehrlich gesagt, mit zwei Unterstrichen hat null praktischen Nutzen. Vermeiden Sie die Versuchung, es zu benutzen. Zumindest, benutze es nicht, bis du deine Grundlogik hast, dann kannst du zurückgehen und Attribute verbergen, die du nicht aussetzen möchtest.

  • Tkinter-Tastaturunterbrechung wird nicht behandelt, bis der TKinter-Frame angehoben wird
  • AttributeError: 'KeinType' Objekt hat kein Attribut 'Löschen'
  • Python 2.7 CV2 & Tkinter mit Webcam
  • Funktion zum Schließen des Fensters in Tkinter
  • Python / Tkinter: Verwenden von Tkinter für RTL (rechts-nach links) Sprachen wie Arabisch / Hebräisch?
  • Python 3 pyQt4 aktualisieren GUI mit Variablen aus mehreren Modulen / Klassen
  • Griechische Buchstaben in einer GUI - PYTHON
  • So erstellen Sie das untergeordnete Fenster und kommunizieren mit dem übergeordneten Element in TkInter
  • Python ist die beste Programmiersprache der Welt.