这是我在这里发表的第一篇文章。我试图用随机数创建一个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()
答案 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()