为什么这个随机选择器总是选择相同的选择

时间:2018-12-03 17:29:43

标签: python random tkinter

我正在学习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()

2 个答案:

答案 0 :(得分:3)

您的程序在单击按钮时始终运行相同选项的原因是因为在程序启动时选择了标签(onetwo),而不是每次都单击按钮。因此,程序启动时,它将选择onetwo,然后该按钮将始终运行所选标签(直到重新启动)。基本上random.choice在开始时只执行一次,然后在程序运行期间设置doit

要解决此问题,请在单击按钮时选择标签。您可以这样重新定义doit

def doit():
    rchoice = [one, two]
    selected = random.choice(rchoice)
    return selected()

答案 1 :(得分:1)

问题是doit不是function,而是{<1>}在主循环之前调用的random.choice()的结果值。因此,一旦它停留在twoone上,它就永远不会在您的程序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