【问题标题】:Object Oriented Tkinter Coding: Changing text and Updating面向对象的 Tkinter 编码:更改文本和更新
【发布时间】:2016-05-16 03:39:59
【问题描述】:

所以我一直在自学 Tkinter 项目的面向对象编程,因为我清楚地看到它们对大量编码更有组织。但是,我必须承认,我只是通过简单地从网上复制各种代码来滑行,并没有完全理解其目的是什么。

这使我发现我的代码根本无法运行,我不知道为什么会这样。第一个问题是简单地更改其他小部件的一个方面。

我有这个示例代码:

    import Tkinter as tk

LARGE_FONT = ("Verdana", 12)

class SeaofBTCapp(tk.Tk):
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        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 = {}
        frame = StartPage(container, self)
        self.frames[StartPage] = frame

        frame.grid(row = 0, column = 0, sticky = "nsew")

        self.show_frame(StartPage)

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

class StartPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text = "Start Page", font = LARGE_FONT)
        label.pack(pady = 10, padx = 10)
        button = tk.Button(self, text = "Change Label", command = self.change)
        button.pack(pady = 10, padx = 10)

    def change(self):
        label["text"] = "It has changed"

app = SeaofBTCapp()
app.mainloop()

这应该是一个足够简单的代码,只需按下按钮,即可将标签从“起始页”更改为“已更改”。但是每当我运行它时,它都会说未定义全局变量“label”。此外,如果我将其更改为 self.label,则表明 StartPage 实例没有属性“标签”。我不知道我做错了什么。

此外,以类似的方式,我正在开发一个项目,该项目有一个 SideBar 类和一个与一个 MainApplication 类相关联的 Main 类。 Main 类获取一个值并将其显示在 Main 类的 Frame 上。在此之后,侧边栏中的按钮将该值增加 1。但主显示不会更新,我不知道如何将主更新与侧边栏中的按钮联系起来。

import Tkinter as tk

something = [0, 6]

class Main():
    def __init__(self, root):
        mainboard = tk.Frame(root, height = 100, width = 100)
        self.maincanvas = tk.Canvas(mainboard, bd = 1, bg = "white")

        mainboard.grid(row = 0, column = 0)
        self.maincanvas.grid(row = 0, column = 0)

        self.maincanvas.create_text(45, 50, anchor = "center", text = str(something[1]))

class SideBar():
    def __init__(self, root):
        sidebarframe = tk.Frame(root, height = 100, width = 100)
        button = tk.Button(sidebarframe, width = 20, text = "Change Value", command = self.add)

        sidebarframe.grid(row = 0, column = 1)
        button.grid(row = 0, column = 0)

    def add(self):
        something[1] += 1
        print something[1]


class MainApplication():
    def __init__(self, parent):
        self.parent = parent
        self.sidebar = SideBar(self.parent)
        self.main = Main(self.parent)

if __name__ == "__main__":
    root = tk.Tk()
    MainApplication(root)
    root.mainloop()

我们将不胜感激,但请尽量不要使用太多技术术语,因为我还在学习。

【问题讨论】:

    标签: python-2.7 oop tkinter


    【解决方案1】:

    在第一个场景中替换:

    label = tk.Label(self, text = "Start Page", font = LARGE_FONT)
    label.pack(pady = 10, padx = 10)
    

    与:

    self.label = tk.Label(self, text = "Start Page", font = LARGE_FONT)
    self.label.pack(pady = 10, padx = 10)
    

    在函数change中也这样写:

    self.label["text"] = "It has changed"
    

    在您的第二个问题中,我稍微更改了代码以使其正常工作:

    import Tkinter as tk
    
    something = [0, 6]
    
    class Main():
        def __init__(self, root):
            mainboard = tk.Frame(root, height = 100, width = 100)
            self.maincanvas = tk.Canvas(mainboard, bd = 1, bg = "white")
    
            mainboard.grid(row = 0, column = 0)
            self.maincanvas.grid(row = 0, column = 0)
    
            self.maincanvas.create_text(45, 50, anchor = "center", text = str(something[1]))
    
    class SideBar():
        def __init__(self, root, main):
            self.main = main                                                # Putting the main object to self.main
            sidebarframe = tk.Frame(root, height = 100, width = 100)
            button = tk.Button(sidebarframe, width = 20, text = "Change Value", command = self.add)
    
            sidebarframe.grid(row = 0, column = 1)
            button.grid(row = 0, column = 0)
    
        def add(self):
            something[1] += 1
            self.main.maincanvas.delete("all")                                                          # Removing everything from canvas
            self.main.maincanvas.create_text(45, 50, anchor = "center", text = str(something[1]))       # Inserting the new value
            print something[1]
    
    
    class MainApplication():
        def __init__(self, parent):
            self.parent = parent
            self.main = Main(self.parent)                       # The main needs to run first
            self.sidebar = SideBar(self.parent, self.main)      # So that SideBar can use its canvas
    
    if __name__ == "__main__":
        root = tk.Tk()
        MainApplication(root)
        root.mainloop()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2015-02-15
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多