如何获得一个特定的按钮插入值到一个特定的输入框在一系列按钮和输入框由for循环?



我正在做一个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()

相关内容

  • 没有找到相关文章

最新更新