小能豆

tkinter:如何在单击按钮时打印列表?

py

我正在使用 tkinter,我的目标是每当我单击第 2 页时在类内打印列表 L。Page2(Page)目前,如果您运行代码,您会看到一旦您进入第 1 页,字母 A 和 B 就会打印在控制台中,这意味着 tkinter 已经经历了那个 for 循环。我如何更改此代码以仅在单击第 2 页时才执行该 for 循环?仅供参考,我从使用 Tkinter 中的按钮导航到应用程序的不同页面?的答案中借用了代码。

import tkinter as tk

class Page(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
    def show(self):
        self.lift()

class Page1(Page):
   def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       label = tk.Label(self, text="This is page 1")
       label.pack(side="top", fill="both", expand=True)

class Page2(Page):
   def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       L=[]
       for x in ["A","B"]:
           print(x)
           L.append(x)
       label = tk.Label(self, text=L)
       label.pack(side="top", fill="both", expand=True)


class Page3(Page):
   def __init__(self, *args, **kwargs):
       Page.__init__(self, *args, **kwargs)
       label = tk.Label(self, text="This is page 3")
       label.pack(side="top", fill="both", expand=True)

class MainView(tk.Frame):
    def __init__(self, *args, **kwargs):
        tk.Frame.__init__(self, *args, **kwargs)
        p1 = Page1(self)
        p2 = Page2(self)
        p3 = Page3(self)

        buttonframe = tk.Frame(self)
        container = tk.Frame(self)
        buttonframe.pack(side="top", fill="x", expand=False)
        container.pack(side="top", fill="both", expand=True)

        p1.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
        p2.place(in_=container, x=0, y=0, relwidth=1, relheight=1)
        p3.place(in_=container, x=0, y=0, relwidth=1, relheight=1)

        b1 = tk.Button(buttonframe, text="Page 1", command=p1.lift)
        b2 = tk.Button(buttonframe, text="Page 2", command=p2.lift)
        b3 = tk.Button(buttonframe, text="Page 3", command=p3.lift)

        b1.pack(side="left")
        b2.pack(side="left")
        b3.pack(side="left")

        p1.show()

if __name__ == "__main__":
    root = tk.Tk()
    main = MainView(root)
    main.pack(side="top", fill="both", expand=True)
    root.wm_geometry("400x400")
    root.mainloop()

阅读 19

收藏
2025-01-01

共1个答案

小能豆

它正在打印列表,因为这是在类Page2可见之前(如果有的话)创建的类实例的一部分 - 这只是您“借用”的答案中的代码架构的产物。

以下是修复问题的一种方法。首先更改Button回调command=选项,MainView.__init__()以便show()调用该方法而不是lift()

        b1 = tk.Button(buttonframe, text="Page 1", command=p1.show)
        b2 = tk.Button(buttonframe, text="Page 2", command=p2.show)
        b3 = tk.Button(buttonframe, text="Page 3", command=p3.show)

这意味着每当单击其中一个时,每个Page子类的show()方法都会被调用,默认情况下只调用其基类的方法,因此这样做只是添加了一个间接级别 - 从而可以轻松地在子类中覆盖/扩展它,使它们执行可能需要的任何专门处理。Button``lift()``Page2

请注意,我还创建了子类实例的属性L(而不是将其作为方法中的局部变量),以便在该类的其他方法中轻松引用它。__init__()

class Page2(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)
        self.L = []
        for x in ["A","B"]:
            self.L.append(x)
        label = tk.Label(self, text=self.L)
        label.pack(side="top", fill="both", expand=True)

    def show(self):
        print(f'in class {type(self).__name__}.show()')
        super().show()  # Call superclass' method.
        for x in self.L:
            print(x)
2025-01-01