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

从类Python 3 tkinter中的函数调用textvariable,python,class,tkinter,definition,Python,Class,Tkinter,Definition,感谢您在我的问题上给予的帮助 我在tkinter中使用Python3,我在tkinter中设置了多个页面,但是我试图调用一个特定的textvariable,它位于一个类中,在一个定义中,我想知道是否可以使用我构建脚本的方式 这是一个相当大的脚本,所以我不想在这里粘贴所有的代码,我希望这将是足够的 基本上,这个类被称为poin(tk.frame),我正在尝试调用 class POPage(tk.Frame): def __init__(self, parent, controller):

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

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

非常感谢您的帮助


BR,

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

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

这提供的主要好处是,框架类的任何实例都将有自己的
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())
您有一个主
应用程序
(在您的示例中称之为
Ghost
),它有多个帧(我的示例只有一个帧类,但
应用程序
有该帧类的两个实例)。每个框架实例都有一个条目小部件和一个唯一的、完全独立的、不同的对应条目变量对象。框架没有理由共享同一个条目变量对象。使小部件和条目变量对象成为其类的实例变量应该完全避免使用
global
变量


在我的示例中,如果我需要从类之外访问条目小部件中的值,例如在
main
函数中,您可以说
application.frames[0].entry\u var.get()
来获取第一个框架的条目小部件中的值。

您希望
POPage.entrybox(凭单).get()的具体内容是什么
要做什么?很抱歉不清楚,但我想让它获取文本变量值这与
凭证.get()有何不同?似乎您正在多个页面之间共享此全局
凭证
对象,因此也在多个
tk.Entry
对象之间共享。为什么它首先需要是全局的?这是必需的,因为我将在类之外的另一个函数中有一个输出。我认为是我的知识不足限制了我的写作,我可以用更好的方式重写它。也许我可以把整个代码上传到某个地方让你看一看?如果你愿意,你可以把整个代码发布在pastebin上,然后把链接发布到这里。不过,我不能保证明天之前我能看一看。谢谢,我会尝试一下,边做边学是一条路。感谢您的意见!