【问题标题】:Create TKinter label using class method使用类方法创建 TKinter 标签
【发布时间】:2021-07-29 13:55:55
【问题描述】:

我正在尝试使用面向对象的编程风格来编写 Tkinter 应用程序的代码。我想使用类方法将标签(或其他小部件)放置到 GUI。我编写的代码正在向 GUI 添加一个我不希望的字符。如何编写初始 add_label 方法 使其不添加不需要的字符。 下面是我的代码和截图。我是 OOP 的新手,所以我可能会遗漏一些东西。

from tkinter import *
class App:
    def __init__(self, parent):
        self.widgets(root)
        self.add_label(root)

    def widgets(self, app):
        self.title = Label(app, text= 'LABEL UP').pack()
        self.btn = Button(app, text = 'BUTTON').pack()
    def add_label(self, text):
        Label(text= text).pack()

root = Tk()
App(root)
App.add_label(root, 'LABEL_1')
App.add_label(root,'LABEL_2')
root.mainloop()

我是 OOP 的新手,仍然试图弄清楚在这种情况下如何从代码重用中受益。我的应用有几个小部件和功能

【问题讨论】:

  • 你能举例说明你想要什么和你得到什么吗?
  • @CoolCloud 添加截图
  • 删除self.add_label(root)

标签: python oop tkinter


【解决方案1】:

你希望self.add_label(root) 做什么?根据您的方法定义,它以text 作为参数,所以当您说self.add_label(root) 时,您将root 作为text 传递。 root 是什么?它是'.',所以删除它就会消失。

虽然这样做的正确方法是将parent 参数传递给该方法并在创建小部件时使用它:

重要的是,您实例化了 class 错误。保留对它的引用,而不是创建很多实例。

from tkinter import *

class App:
    def __init__(self, parent):
        self.widgets(root)

    def widgets(self, app):
        self.title = Label(app, text= 'LABEL UP').pack()
        self.btn = Button(app, text = 'BUTTON').pack()
    
    def add_label(self, parent, text):
        Label(parent,text= text).pack()

root = Tk()

app = App(root)
app.add_label(root, 'LABEL_1')
app.add_label(root,'LABEL_2')

root.mainloop()

尽量不要混淆这两个错误。

我将如何编写这门课?我不知道这样做的真正目的,但我认为您可以遵循以下内容:

from tkinter import *

class App:
    def __init__(self, parent):
        self.parent = parent
        
        self.title = Label(self.parent, text='LABEL UP')
        self.title.pack()

        self.entry = Entry(self.parent)
        self.entry.pack()

        self.btn = Button(self.parent, text='BUTTON')
        # Compliance with PEP8
        self.btn.config(command=lambda: self.add_label(self.entry.get())) 
        self.btn.pack()

    def add_label(self, text):
        Label(self.parent, text=text).pack()

    def start(self):
        self.parent.mainloop()

root = Tk()

app = App(root)
app.start()

【讨论】:

  • 我很想看看你所说的任何其他选项(......虽然这样做的正确方法是将父参数传递给方法并在创建小部件时使用它...... )
  • @mapperx 更多选项?我包含的代码是当前代码可以修改为(IMO)的最佳方式。或者你当然可以只重构你的代码。您不需要创建方法来创建标签。这只是一行代码,手动执行。可以将可重用的不同小部件上的功能制作到方法上。而且几乎所有变量在您的代码中都是None
  • @mapperx 检查更新的答案以查看替代结构。
  • 为了清楚起见,'父'在你的实现中代表什么以及你为什么选择添加启动方法。我得到了代码的基础知识。我真的想更好地理解 OOP。已经阅读了一些材料,但对我来说很难将其用于解决现实生活中的问题。
  • 清晰易懂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多