我正在学习python,有点弄乱了我的能力。作为更大项目的概念证明,我制作了一个非常非常简单的python scrip,它将在GUI上显示“一”或“二”,但这是行不通的。随机选择器始终选择两个,而不选择一个。这是代码:
from tkinter import*
import random
root = Tk()
root.geometry("800x500")
root.title("amazing")
def one():
label1 = Label(root, text="one", font=("Comic Sans MS", 30), fg="purple").place(x=100, y=300)
def two():
label2 = Label(root, text="two", font=("Comic Sans MS", 30), fg="purple").place(x=100, y=300)
rchoice = [two, one]
doit = random.choice(rchoice)
Button = Button(root, text="Button", width=15, height=3, font=("Comic Sans MS", 20), fg="blue", bg="lightgreen", command=doit).pack(pady=50)
root.mainloop()
答案 0 :(得分:3)
您的程序在单击按钮时始终运行相同选项的原因是因为在程序启动时选择了标签(one
或two
),而不是每次都单击按钮。因此,程序启动时,它将选择one
或two
,然后该按钮将始终运行所选标签(直到重新启动)。基本上random.choice
在开始时只执行一次,然后在程序运行期间设置doit
。
要解决此问题,请在单击按钮时选择标签。您可以这样重新定义doit
:
def doit():
rchoice = [one, two]
selected = random.choice(rchoice)
return selected()
答案 1 :(得分:1)
问题是doit
不是function
,而是{<1>}在主循环之前调用的random.choice()
的结果值。因此,一旦它停留在two
或one
上,它就永远不会在您的程序doit
不调用random.choice()
函数来选择其他函数的过程中再次更改。
您需要将Button
的{{1}}参数改为:
command
这允许btn = Button(root, text="Button", width=15, height=3, font=("Comic Sans MS", 20), fg="blue", bg="lightgreen", command=lamdba: random.choice(rchoice)).pack(pady=50)
每次调用command
时执行random.choice()
函数。
覆盖Button
之类的导入名称也是一个糟糕的主意。使用其他名称,例如Button
,否则之后将永远无法创建其他btn
。
或者,根本不使用星号导入:
Button