为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2022-10-25 15:07:36
我有一个for循环,旨在遍历列表,在 tkinter 中显示一些项目,等待按下按钮,然后存储一些Entry和Checkbutton数据。下面的代码是我正在尝试做的基础知识的 MRE。在下面的情况下,当Button被击中时,我想返回loop_function并从button_function.我想也许使用类似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()
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

我认为以下代码可以完成您想做的事情。单击按钮Start后,用户会看到一个对话框,她可以在其中输入第一个用户Luke的属性。通过单击按钮保存输入的数据以某种方式存储。然后可以编辑下一个用户 ( Han )的属性。


for 循环在这里不是正确的方法。相反,我们想监听开始和保存按钮的点击事件。在我的解决方案中,当用户单击Start时,将调用事件处理程序pick_next_player。next此方法总是从我环绕的迭代器中挑选元素name_list。然后 GUI 元素将使用您的button_function.


事件处理程序save_action侦听保存按钮的单击事件。它收集用户输入的值,将其存储到self.results并通过调用显示下一个玩家pick_next_player。


当最后一个玩家被保存后,这个脚本只会在控制台打印一行'finished ...'。我假设您要停止脚本或关闭那里的对话框。但这当然取决于你。


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.pick_next_player)

                .grid(column=0, row=0, padx=10, pady=10)

        )


        self.name_list = ['Luke', 'Han', 'Leia', 'Chewie']

        self.name_iter = iter(self.name_list)

        self.results = []

        self.current_name = None


    def pick_next_player(self):

        try:

            self.current_name = next(self.name_iter)

        except StopIteration:

            print(f"finished: {self.results}")

            return


        self.button_function()


    def button_function(self):

        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=self.current_name, 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=self.save_action)

                .grid(column=1, row=2, padx=10, pady=10)

        )


    def save_action(self):

        force_user = self.fu.get()

        side = self.sd.get()

        print(f"saving {self.current_name}, {force_user}, {side}")

        self.results.append({'name': self.current_name, 'force': force_user, 'faction': side})

        self.pick_next_player()



if __name__ == '__main__':

    root = Tk()

    ui = TestClass(root)

    ui.pack()

    root.mainloop()




查看完整回答
反对 回复 2022-10-25
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信