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

Calling textvariable from function within a class Python 3 tkinter

感谢您对我的问题的任何帮助。

我将 Python 3 与 tkinter 一起使用,在那里我设置了多个页面,但是我试图调用定义中 class 中的特定文本变量,并想知道它是否可能与我构建脚本的方式有关。

这是一个很大的脚本,所以我不想在这里粘贴所有代码,我希望这就足够了。

基本上 class 称为 POIIN(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)

我试图通过在 class 之外执行以下操作来调用文本变量:

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(voucher.get()) 即可从另一个 class(页面)提取凭证。 我当然可以重命名 textvariable 并以这种方式调用它(我不介意),但如果有任何解决方法,那就太好了。

非常感谢您的帮助!

BR,

感谢您将整个代码发布到 pastebin 上。通过查看您的代码,我可以看到您的 class 中的 none 实际上拥有他们创建的 tkinter 小部件。换句话说,它们没有任何实例变量。我建议彻底重新设计并删除所有 global 变量和对象 - 在这种情况下,这是一个主要的代码味道,表明你的设计存在缺陷 - 没关系,你确实说过你是初学者毕竟。我在您的代码中也看到了很多好东西!不能片面...

基本上,我建议的更改是:每个框架 class 都应该拥有它们创建的小部件的所有权。这包括 tk.Labels、tk.Buttons、tk.Entrys 和 tk.IntVars 等。

这提供的主要好处是,您的框架 class 的任何实例都将拥有自己的 tk.IntVar(或任何条目小部件变量,如 tk.StringVar),而它没有需要与任何其他 classes 共享(你称之为 textvariable)。如果您考虑一下,这是有道理的:每个 tk.Entry 小部件都与一个变量对象耦合,该变量对象跟踪用户为该条目小部件输入的数据 - 如果您只创建一个全局条目变量并将其与所有条目小部件共享在所有框架中,您很容易丢失用户输入的数据 - 真的没有理由这样做。

使用以下代码片段尝试 running/playing:

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())

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

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