从类Python 3 tkinter中的函数调用textvariable

2024-04-19 23:00:15 发布

您现在位置:Python中文网/ 问答频道 /正文

感谢您在我的问题上给予的帮助

我在tkinter中使用Python3,我在tkinter中设置了多个页面,但是我试图调用一个特定的textvariable,它位于一个类中,在一个定义中,我想知道是否可以使用我构建脚本的方式

这是一个相当大的脚本,所以我不想在这里粘贴所有的代码,我希望这将是足够的

基本上,这个类被称为poin(tk.frame),我正在尝试调用

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

    self.entryboxes()

def entryboxes(self):
    # Entry boxes + variables
    global voucher
    voucher = IntVar()
    entry_box3 = tk.Entry(self, textvariable=voucher, width=32, bg="lightgreen")
    entry_box3.place(x=435, y=151)

我试图通过在类外执行以下操作来调用textvariable:

def do_mssql():
try:
    if int(POPage.entryboxes(voucher).get()) > int(maxN):
        voucherchktext()
    elif int(voucher.get()) < int(minN):
        voucherchktext()

    else:
        sql()
except:
    vouchermissing()

但是,它似乎在调用IntVar(),我没有收到任何错误消息(对于Python来说非常新) 基本上,我可以从另一个类(页面)中提取凭证,只需执行int(concreate.get())。 当然,我可以重命名textvariable并以这种方式调用它(我不介意),但如果有任何方法可以解决这个问题,那就太好了

非常感谢您的帮助

比尔


Tags: self脚本getinittkinterdef方式页面
1条回答
网友
1楼 · 发布于 2024-04-19 23:00:15

感谢您在pastebin上发布您的全部代码。通过查看您的代码,我可以看到您的类中没有一个真正拥有它们创建的tkinter小部件。换句话说,它们没有任何实例变量。我建议进行彻底的重新设计,去掉所有global变量和对象——在本例中,这是一种主要的代码气味,表明您的设计存在缺陷——没关系,您确实说过您是一名初学者。我在你的代码中也看到了很多好东西!不要一边倒

基本上,我建议的变化是:每个框架类都应该拥有它们创建的小部件的所有权。这包括{}、{}、{}和{}等

这提供的主要好处是,框架类的任何实例都有自己的tk.IntVar(或任何条目小部件变量,如tk.StringVar),它不需要与任何其他类共享(您称之为textvariable)。如果您仔细想想,这是有意义的:每个tk.Entry小部件都与一个变量对象耦合,该对象跟踪用户为该条目小部件输入的数据-如果您只创建一个全局条目变量,并与所有帧中的所有条目小部件共享它,您可能很容易丢失用户输入的数据-实际上没有理由这样做

尝试运行/播放以下代码段:

import tkinter as tk


class MyFrame(tk.Frame):

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

        self.label = tk.Label(self, text="Some Text")
        self.label.pack()

        self.entry_var = tk.IntVar()
        self.entry = tk.Entry(self, textvariable=self.entry_var, width=32)
        self.entry.pack()

        self.button = tk.Button(self, text="Print this frame's 'entry_var'", command=lambda: print(self.entry_var.get()))
        self.button.pack()


class Application(tk.Tk):

    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.title("Title")
        self.geometry("256x256")
        self.resizable(width=False, height=False)

        self.frames = []

        for frame in MyFrame(), MyFrame():
            self.frames.append(frame)
            frame.pack()

def main():

    application = Application()
    application.mainloop()

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

您有一个main Application(在您的示例中称之为Ghost),它有多个帧(我的示例只有一个帧类,但是Application有该帧类的两个实例)。每个框架实例都有一个条目小部件和一个唯一的、完全独立的、不同的对应条目变量对象。框架没有理由共享同一个条目变量对象。使小部件和条目变量对象成为其类的实例变量应该完全消除global变量的使用

在我的示例中,如果我需要从类外部访问条目小部件中的值,例如在main函数中,您可以说application.frames[0].entry_var.get()来获取第一帧条目小部件中的值

相关问题 更多 >