所以我使用tkinter创建一个按钮,显示列表中的随机项。按下时,它会显示一个来自所述列表的新项目,方法是循环一个随机数生成器,直到它创建一个与旧数字不同的数字。因为它们是tkinter按钮,所以新数字的创建必须是一个函数,并且按钮本身在函数内部。
我发现当前随机数的变量没有正确刷新。值在全局变化但不在包含按钮的函数内部,因此当所述按钮运行函数以生成新数字时,它会根据生成的第一个数字而不是前一个数字进行检查。
from tkinter import *
import random
global rnum
def Load():
ListPath = (".\\Lists\\test.txt")
f = open(ListPath, "r")
LineList = f.readlines()
rnum = random.randint(0,(LineList.__len__()-1))
load = Tk()
word = Button(load, text = LineList[rnum], command = lambda: NewRN(rnum, word, LineList), font = ("Calibri", 30))
word.pack()
def NewRN(rnum, word, LineList):
rnumold = rnum
while(rnum == rnumold):
rnum = random.randint(0,(LineList.__len__()-1))
word.config(text = LineList[rnum])
return(rnum)
Load()
当按下按钮时,它有可能从列表中显示相同的项目,因为rnum一旦运行就没有传回函数。
有没有人能解决这个问题?提前谢谢。
答案 0 :(得分:1)
您的代码中存在许多尴尬。您应该尊重命名约定。见PEP8
使用global
:
global rnum
分析后, rnum 似乎不是全局变量,或者您不将其用作全局变量。无论如何,global
关键字仅在函数内有用。请参阅此问题Use of “global” keyword in Python
ListPath = (".\\Lists\\test.txt")
听起来是list
,但事实并非如此!实际上,这是一个字符串。
所以,你可以写下来:
ListPath = ".\\Lists\\test.txt"
要打开文件,请使用with
语句。请参阅Reading and Writing files。
with open(ListPath, "r") as f:
LineList = f.readlines()
要获取列表的长度,请使用len()
函数:
rnum = random.randint(0, len(LineList) - 1)
我没有看到任何"主循环"在你的程序中。请参阅文档中的example