Python/Tkinter:使用按钮控制循环

Python/Tkinter:使用按钮控制循环,python,tkinter,Python,Tkinter,我有一个for循环,用于遍历列表,在tkinter中显示一些项目,等待按钮按下,然后存储一些条目和检查按钮数据。下面的代码是我正在尝试做的基本工作的MRE。在下面的例子中,当按下按钮时,我想返回循环函数,并从按钮函数收集变量 我想也许使用像lambda:continue或lambda:return这样的函数可能会使它返回到第一个函数,但这些函数会抛出错误 有什么想法吗 from tkinter import * class TestClass(Frame): def __init__(

我有一个
for
循环,用于遍历列表,在tkinter中显示一些项目,等待按钮按下,然后存储一些
条目
检查按钮
数据。下面的代码是我正在尝试做的基本工作的MRE。在下面的例子中,当按下
按钮
时,我想返回
循环函数
,并从
按钮函数
收集变量

我想也许使用像
lambda:continue
lambda:return
这样的函数可能会使它返回到第一个函数,但这些函数会抛出错误

有什么想法吗

from tkinter import *

class TestClass(Frame):
    def __init__(self, parent=None):
        self.parent = parent
        Frame.__init__(self)
        self.main = self.master
        self.f = Frame(self.parent)
        self.f.pack()

        (Button(self.f, text='Start', 
            command = self.loop_function)
            .grid(column=0, row=0, padx=10, pady=10))

    def loop_function(self):
        name_list = ['Luke', 'Han', 'Leia', 'Chewie']

        for n in name_list:
            self.button_function(n)
            force_user = self.fu.get()
            side = self.sd.get()
            print(n, force_user, side)

    def button_function(self, n):
        self.fu = IntVar(value=1)
        self.sd = StringVar(value='rebel')

        self.fu_e = Checkbutton(self.f, variable=self.fu)
        self.sd_e = Entry(self.f, textvariable=self.sd)

        col = 0
        lbl_list = ['Name', 'Force User?', 'Side']
        for l in lbl_list:
            (Label(self.f, text=l, width=11, anchor=W)
                .grid(column=col, row=0, padx=10, pady=10))
            col += 1

        (Label(self.f, text=n, width=11, anchor=W)
            .grid(column=0, row=1, padx=5))
        self.fu_e.grid(column=1, row=1)
        self.sd_e.grid(column=2, row=1)
        (Button(self.f, text='Save', 
            command = lambda: print('WAIT HERE!!'))
            .grid(column=1, row=2, padx=10, pady=10))

if __name__ == '__main__':
    root=Tk()
    ui = TestClass(root)
    ui.pack()
    root.mainloop()

我认为下面的代码符合您的要求。 单击“开始”按钮后,用户将获得一个对话框,可以在其中输入第一个用户的属性。通过单击“保存”按钮,输入的数据将以某种方式存储。然后可以编辑下一个用户(Han)的属性

在这里,for循环不是正确的方法。相反,我们想要监听“开始”和“保存”按钮的单击事件。在我的解决方案中,当用户单击开始时,将调用事件处理程序
pick\u next\u player
。这个方法总是从我围绕
name\u list
编写的迭代器中选择
next
元素。然后,GUI元素将通过
按钮\u函数
呈现

事件处理程序
save_action
侦听save按钮的click事件。它收集用户输入的值,将其存储到
self.results
中,并通过调用
pick\u next\u player
显示下一个播放器

保存最后一个播放机后,此脚本只向控制台打印一行“finished…”。我假设您将停止脚本或关闭那里的对话框。但这当然取决于你

从tkinter导入*
类TestClass(框架):
def uuu init uuu(self,parent=None):
self.parent=parent
帧。\uuuu初始化\uuuuu(自)
self.main=self.master
self.f=帧(self.parent)
self.f.pack()
(
按钮(self.f,text='Start',command=self.pick\u next\u player)
.grid(列=0,行=0,padx=10,pady=10)
)
self.name_list=['Luke'、'Han'、'Leia'、'chuie']
self.name\u iter=iter(self.name\u列表)
self.results=[]
self.current_name=None
def选择下一个玩家(自我):
尝试:
self.current\u name=next(self.name\u iter)
除停止迭代外:
打印(f“已完成:{self.results}”)
返回
self.button_函数()
def按钮功能(自):
self.fu=IntVar(值=1)
self.sd=StringVar(value='rebel')
self.fu_e=Checkbutton(self.f,变量=self.fu)
self.sd_e=Entry(self.f,textvariable=self.sd)
col=0
lbl_列表=['Name','Force User','Side']
对于lbl\U列表中的l:
(标签(self.f,text=l,width=11,anchor=W)
.grid(列=col,行=0,padx=10,pady=10))
col+=1
(
标签(self.f,text=self.current_name,width=11,anchor=W)
.grid(列=0,行=1,padx=5)
)
自网格(列=1,行=1)
self.sd_e.grid(列=2,行=1)
(
按钮(self.f,text='Save',command=self.Save\u操作)
.grid(列=1,行=2,padx=10,pady=10)
)
def保存_操作(自我):
force\u user=self.fu.get()
side=self.sd.get()
打印(f“保存{self.current_name},{force_user},{side}”)
self.results.append({'name':self.current_name,'force':force_用户,'section':side})
self.pick_next_player()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
ui=TestClass(根)
ui.pack()
root.mainloop()

lambda:return
毫无意义,因为
func=lambda:something
def func():return something
lambda:continue
:return continue。谢谢我知道。如上所述。这很好:)我只是解释了原因。可能是我,但你的代码对我来说毫无意义。我认为您应该仔细阅读GUI应用程序的事件驱动特性。是的!这就是我想要的,并且使用了一些我以前从未使用过的方法。非常感谢你!