PythonTkinter。用按钮来控制循环

我有一个 for 循环,旨在运行一个列表,在tkinter中显示一些项目,等待一个按钮被按下,然后存储一些 EntryCheckbutton 数据。下面的代码是我要做的基本内容的MRE。在下面的例子中,当 Button 被击中,我想返回到 loop_function 并收集来自 button_function.

我想也许使用类似 lambda: continuelambda: 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()

解决方案:

我认为下面的代码可以实现你想要做的事情.在点击按钮后,你会发现,在你的电脑上有一个按钮。开始 用户会看到一个对话框,在这里她可以输入第一个用户的属性。卢克. 通过点击按钮 保存 输入的数据以某种方式存储。然后下一个用户的属性()可以被编辑。

这里的for循环并不是正确的方法,而是我们要监听开始和保存按钮的点击事件。相反,我们要监听开始和保存按钮的点击事件。在我的解决方案中,当用户点击 “开始 “和 “保存 “按钮时,我们要监听它们的点击事件。开始,事件处理程序 pick_next_player 正在被调用。这个方法总是选择 next 迭代器中的元素,我将其封装为 name_list. 然后,GUI元素正在用你的 button_function.

事件处理程序 save_action 的点击事件,监听 保存 按钮。它收集用户输入的值,并将其存储至 self.results 并通过调用 pick_next_player.

当最后一个玩家被保存后,这个脚本只是打印了一行 “完成… “到控制台。我假设你要停止脚本或关闭对话框。但这当然是由你决定的。

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()


给TA打赏
共{{data.count}}人
人已打赏
未分类

VS代码中红色矩形内的文字是什么意思?

2022-9-13 13:12:20

未分类

使用不寻常的参数改变ggplot中X Y标签的大小。

2022-9-13 13:23:36

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索