1

我遇到的问题专门与 Label 小部件有关。在链接的代码中,Text 小部件和 Button 小部件的测试都获取继承的值并正确显示它。

您可以在PageTwo 类中找到有问题的标签小部件

我试图在标签中继承和显示的变量是第一类中设置的“ num ”变量。

目标是获取该变量,在另一个类中设置值,然后稍后在 Label 小部件中显示新设置的值。

我试图设置 Label 以在 f 字符串中直接显示变量作为 str 值,以及在 PageTwo 中设置局部变量以获取 TestClass.num 的值

有问题的代码示例是:

import tkinter as tk


class TestClass(tk.Tk):
    num = None

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        tk.Tk.wm_title(self, "Game")

        container = tk.Frame(self)
        container.pack(side="top", fill="both", expand=True)
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in (PageOne, PageTwo):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky="nsew")
        self.show_frame(PageOne)

    def show_frame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()


class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self,
                         text="Make a selection",
                         wraplength=450, justify='center')
        label.pack(padx=10, pady=10)

        TestClass.num = tk.StringVar()
        tk.Radiobutton(self, text="1", variable=TestClass.num, value="1", ).pack()
        tk.Radiobutton(self, text="2", variable=TestClass.num, value="2", ).pack()
        tk.Radiobutton(self, text="3", variable=TestClass.num, value="3", ).pack()

        view_selection = tk.Button(self, text="test selection", command=lambda: print(TestClass.num.get()))
        view_selection.pack()

        next_page = tk.Button(self, text="Next Page",
                              command=lambda: controller.show_frame(PageTwo))
        next_page.pack(pady=10, padx=10)


class PageTwo(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        # label = tk.Label(self, text=TestClass.num.get()
        label = tk.Label(self, text=f"The number should show up here -> {TestClass.num.get()}  <- ")
        label.pack()

        text1 = tk.Text(self)
        text1.pack()

        see_num = tk.Button(self, text="View Number",
                            command=lambda: text1.insert('1.0', TestClass.num.get()))
        see_num.pack(pady=10, padx=10)


app = TestClass()
app.mainloop()
4

1 回答 1

1

一段时间以来,我已经遇到过控制器的这种用法,但从来没有真正知道这个想法是从哪里来的。无论如何,在这里我看到问题实际上可能出在程序流中(当您实例化时,F(container, self)您正在执行__init__该类的,因此已经设置了值。

当您选择单选按钮中的每个项目时,您希望标签的值能够适当地自行编辑。因此,我认为静态变量更合适(访问另一个类中的小部件),您可以使用它command来触发回调。

此外,您还需要通过为不等于of或给每个单选按钮不同的初始值或使用不使用 this的方式来解决您的三态问题RadiobuttonStringVartristatevalueRadiobuttontristatevaluettk.Radiobuttontristatevalue

所以要做的改变PageTwo是创建一些静态变量:

class PageTwo(tk.Frame):
    label = ''
    text = ''
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        PageTwo.text = "The number should show up here ->  {}  <- " # {} so we can `format` it to be whatever text we want, later
        PageTwo.label = tk.Label(self, text=self.text.format(''))
        PageTwo.label.pack()
        ...
        ...

在 中PageOne,您需要为command每次Radiobutton更改选项时都会调用它。

class PageOne(tk.Frame):
    def __init__(self, parent, controller):
        ...
        ...
        TestClass.num = tk.StringVar(value=' ')
        command = lambda *args: PageTwo.label.config(text=PageTwo.text.format(TestClass.num.get()))
        tk.Radiobutton(self, text="1", variable=TestClass.num, value="1",command=command).pack()
        tk.Radiobutton(self, text="2", variable=TestClass.num, value="2",command=command).pack()
        tk.Radiobutton(self, text="3", variable=TestClass.num, value="3",command=command).pack()
        ...
        ...

我认为可能的另一种方法是创建一个函数来创建小部件,然后在应该显示页面时加载它。

于 2022-01-23T10:27:19.047 回答