我正在做一个Tkinter项目,它基本上就像一个游戏的应用程序"MadTakes">
工作原理:
玩家被要求"输入一个名词"或者一个代词或任何类型的词。一旦他输入了所有的单词,他就可以按下"Go"键了。而一个有名词或形容词等空白的故事将由玩家输入的单词填充。这样,故事就完成了,它将通过标签框显示。
程序的工作方式是,
我基本上是这样做的,问题的数量将决定通过for循环添加多少行问题和输入框。一开始,我在每个条目框中获取用户所做的单个条目时遇到了问题,但我能够解决这个问题,如下面的代码所示。
要查看我试图实现的程序的工作示例,MadTakes是我的项目所基于的。该网站有一个工作的随机函数的例子,我试图得到。希望能有所帮助!我的代码如下:
写这篇文章的原因是,
我做了一个按钮旁边的输入框的问题,我希望可以插入一个随机的名词,形容词等到它旁边的输入框。
不幸的是,这并没有发生。我能做的最好的事情就是让随机名词出现(entry.insert
)到for
循环产生的最后一个输入框中。
NounList = ["Apple", "Penguin", "Star", "Magnet", "Computer", "Anime"]
def display(): #for displaying inside of a frame
entries1 = []
answer1 = []
def execute():
for txt in entries1:
answer1.append(txt.get()) #gets what the user has inputted to each of the entry boxes and appends it to a list
try:
#the questions to ask on the left of the Entry boxes:
TypeList=["Enter a noun ", "Enter a noun ", "Enter a verb ", "Enter a place ","Enter the place as before"]
for count, i in enumerate(TypeList):
label = Label(frame, text=i+' ')
label.grid(row=count, column=0) #Each question is in a label on a different row
entry = Entry(frame, width=15, borderwidth=0)
entries1.append(entry) #The values that the user enters is appended to the list entries1
entry.grid(row=count, column=1) #Entry box placed next to the label
def randnoun(): #Random function to get a random noun from the list
global NounList
x = random.randint(0, (len(NounList)-1))
random_noun = NounList[x]
entry.delete(0, END)
entry.insert(0,random_noun) #Theoretically this should enter the random noun to the entry box next to the random button
if "noun" in i.lower():
btn = Button(frame, width=8, text='RANDOM', command= randnoun)
btn.grid(row=count, column=2) #Random button placed on the right of Entry box
#This button will start the "process" of taking the values of the entry boxes and eventually putting it in answer 1
btn = Button(frame, width=14, text='GO!'command=execute)
btn.grid(row=count+1, column=1, pady=2)
例如,
输入一个名词 : | | [ 随机)
输入一个动词 : | | [ 随机)
输入一个形容词 : | | [ 随机)
当我按下[RANDOM] Button时,应该是这样的输出:
输入一个名词 : | 苹果 | [ 随机)
输入一个动词 : | | [ 随机)
输入一个形容词 : | | [ 随机)
且answer1
必须包含"Apple"作为用户的第一个条目。(我的意思是它应该在列表中按正确的顺序排列。如果用户自己输入了所有的entrybox,那么这个列表看起来应该不会有什么不同。answer1
是我存储用户给出的所有值的地方,然后将其放入故事中。
我当前的代码是这样实现的:
输入一个名词 : | | [ 随机)
输入一个动词 : | | [ 随机)
输入一个形容词 : | 苹果 | [ 随机)
因为根据我的理解,entries1.append(entry)
获得相应的Entryboxes的值,但试图在代码块的其他任何地方entry.insert
它将导致它被插入到最后一个输入框。有什么解决办法吗?
我计划为所有的问题制作这样的随机函数,这样就会有更多的if "verb" in i.lower()"
类型的语句和更多的randverb
,randadj
等函数。他们都需要解决这个问题才能工作。
注意:此代码块位于主窗口中的框架内。我已经编辑了这段代码的一些部分,使它更容易表达我的问题。为了提供更多的信息,我可以提供一个链接到整个项目的代码。
您的主要问题是试图访问for/loop
中的单个Entry
对象并在称为display
的函数中声明列表。我在代码的关键点上加了注释,以强调这些更改。
import random
import tkinter as tk
master = tk.Tk()
frame = tk.Frame(master)
frame.grid()
NounList = ["Apple", "Penguin", "Star", "Magnet", "Computer", "Anime"]
# questions to ask on the left of the Entry boxes:
TypeList=["Enter a noun ", "Enter a noun ", "Enter a verb ",
"Enter a place ","Enter the place as before"]
# removed display() and declare lists in namespace so they are accessible
entries, entries1, answer1 = [], [], []
# used by RANDOM buttons
def redirect(f, *arg):
return lambda: f(*arg)
def execute():
for txt in entries1:
answer1.append(txt.get())
# passing 'entry' solves primary problem
def randnoun(entry):
random_noun = NounList[random.randint(0, (len(NounList) - 1))]
entry.delete(0, tk.END)
entry.insert(0, random_noun)
for count, i in enumerate(TypeList):
label = tk.Label(frame, text = i, padx = 4)
label.grid(row = count, column = 0)
entry = tk.Entry(frame, width = 15, borderwidth = 0)
entries1.append(entry)
entry.grid(row = count, column = 1)
if "noun" in i.lower():
btn = tk.Button(
frame, width = 8, text = "RANDOM",
# redirect is necessary for passing entry to randnoun inside for loop
command= redirect(randnoun, entry))
btn.grid(row = count, column = 2)
btn = tk.Button(frame, width = 14, text = "GO!", command = execute)
btn.grid(row = count + 1, column = 1, pady = 2)
master.mainloop()