我可以访问未分配给变量的按钮信息吗?

时间:2017-04-15 15:03:12

标签: python tkinter

这是我在这里发表的第一篇文章。我试图用随机数创建一个5x5表。目标是用户应该从桌面上的最小到最大数字点击,一旦他点击了正确的数字,它应该被禁用。我不想将每个按钮附加到变量。我用随机数创建了窗口,但现在我想创建一个函数来检查点击的数字是否是最小的,如果答案是肯定的,我必须将它的状态更改为禁用。我一直坐在这上面超过4个小时,我不知道如何访问点击的按钮信息,例如' text',以及如何在用户点击它后禁用它。

这是我到目前为止所做的,研究数据功能。

from tkinter import *
import random


def click(z=None):
    global o
    Button(state=DISABLED)


o=Tk()
y=0
listrow=[4,3,2,1,0]
numbers=[]
spr=IntVar()

while len(numbers) < 25:
    r = random.randint(0,999)
    if r not in numbers:
        numbers.append(r)

for i in range(1,26):
    Button(o, text=str(numbers[i-1]), width=10).grid(row=listrow[i%5], column=y)
    if i == 5:
        y+=1
    elif i == 10:
        y+=1
    elif i==15:
        y+=1
    elif i==20:
        y+=1
    else:
        continue

o.bind_all('<Button-1>', click) 


o.mainloop()

1 个答案:

答案 0 :(得分:0)

考虑将类对象与已定义的模块集成,以构建控件和按钮单击事件。具体来说,在每个按钮上单击检查数字列表的最小值,并通过将索引整数作为参数传递来禁用相应的按钮项。见下面的调整。

在@BrenBarn中获取按钮命令调用中聪明的lambda solution lambda i=i

from tkinter import *
import random

class NUMapp():        
    def __init__(self):
        self.root = Tk()
        self.buildControls()
        self.root.mainloop()

    def buildControls(self):
        self.root.wm_title("Random Number Picker") 
        x = 0; y = 0
        self.numbers = []; self.numbtn = []

        while len(self.numbers) < 25:
            r = random.randint(0,999)
            if r not in self.numbers:
                self.numbers.append(r)

        for i in range(1,26):
            self.numbtn.append(Button(self.root, text=str(self.numbers[i-1]), width=10, 
                               command=lambda i=i:self.btnclick(i-1)))
            self.numbtn[i-1].grid(row=x, column=y)    
            x+=1    
            if i % 5 == 0:
                x = 0
                y += 1

    def btnclick(self, mynum):
        currnum = int(self.numbtn[mynum].cget('text'))     # CAPTURE BUTTON TEXT
        if currnum == min(self.numbers):            
            self.numbtn[mynum].config(state="disabled")    # DISABLE BUTTON
            self.numbers.remove(currnum)                   # REMOVE FOR NEW MINIMUM

NUMapp()