在数组Tkinter中查找小部件

时间:2019-09-16 10:34:45

标签: python tkinter widget

我正在尝试使用Tkinter,并且鼠标事件应更改所单击按钮的文本。

通过测试,这可以与右键()和中键()一起使用。但是,(单击鼠标左键)使用了一个函数,该函数应该在数组中找到小部件的“坐标”(我需要这些数字才能用于以后的计算)。网格的底部行有效,但是其他任何按钮都将导致右下按钮被选中。

from tkinter import *
from random import *

win = Tk()
win.geometry("380x410")
win.grid()

buttons = []

def search(event):
    for j in range(10):
        for i in range(10):
            #print(event.widget)
            if buttons[j][i] == event.widget:
                break
    print(i,j)
    buttons[j][i].config(text="1")

for y in range(10):
    temp = []
    for x in range(10):
        button = Button(win,text="",width=4,height=2)
        button.grid(row=y,column=x)
        button.bind("<Button-1>",search)
        button.bind("<Button-2>",lambda event: event.widget.config(text=""))
        button.bind("<Button-3>",lambda event: event.widget.config(text="R"))
        temp.append(button)
    buttons.append(temp)

我尝试过处理lambda,但是我相信问题出在函数之内。

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

也许这与您要寻找的东西有些接近:

from tkinter import *
from random import *

win = Tk()
win.geometry("380x410")
win.grid()

buttons = []

def search(event):
    i2 = 0
    j2 = 0
    for j in range(10):
        for i in range(10):
            #print(event.widget)
            if buttons[j][i] == event.widget:
                i2 = i
                j2 = j
                event.widget.config(text="1")
                break
    print(i2,j2)
    #buttons[j][i].config(text="1")

for y in range(10):
    temp = []
    for x in range(10):
        button = Button(win,text="",width=4,height=2)
        button.grid(row=y,column=x)
        button.bind("<Button-1>", lambda event: search(event))
        button.bind("<Button-2>",lambda event: event.widget.config(text=""))
        button.bind("<Button-3>",lambda event: event.widget.config(text="R"))
        temp.append(button)
    buttons.append(temp)

win.mainloop()

答案 1 :(得分:0)

  

问题:在数组Tkinter中查找小部件

更简单的解决方案

import tkinter as tk

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        for y in range(10):
            for x in range(10):
                button = tk.Button(self, text="", width=4, height=2)

                button._coords = x, y

                button.grid(row=y, column=x)
                button.bind("<Button-1>", self.on_button_1_click)

    def on_button_1_click(self, event):
        print('on_button_1_click:{}'.format(event.widget._coords))


if __name__ == '__main__':
    App().mainloop()

答案 2 :(得分:0)

确定要在按钮列表中使用坐标还是按钮的索引?

如果您只需要与每个按钮进行精确交互,请尝试使用lambda中的索引值。

from tkinter import *

win = Tk()
win.geometry("380x410")
buttons = []


def search(btn, ndex):
    if btn == '1':
        buttons[ndex].config(text='1')
    if btn == '2':
        buttons[ndex].config(text='')
    if btn == '3':
        buttons[ndex].config(text='R')


for y in range(10):
    for x in range(10):
        buttons.append(Button(win, text="", width=4, height=2))
        ndex = len(buttons) - 1
        buttons[-1].bind("<Button-1>", lambda e, z=ndex: search('1', z))
        buttons[-1].bind("<Button-2>", lambda e, z=ndex: search('2', z))
        buttons[-1].bind("<Button-3>", lambda e, z=ndex: search('3', z))
        buttons[-1].grid(row=y, column=x)

win.mainloop()