繁体   English   中英

在数组Tkinter中查找小部件

[英]Finding widgets in an array Tkinter

我正在尝试使用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,但我认为问题出在函数之内。

任何帮助,将不胜感激。

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

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()

问题 :在数组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()

您确定需要按钮列表中的坐标还是按钮的索引?

如果只需要与每个按钮进行精确交互,请尝试使用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM