从类Python 3 tkinter中的函数调用textvariable
感谢您在我的问题上给予的帮助 我在tkinter中使用Python3,我在tkinter中设置了多个页面,但是我试图调用一个特定的textvariable,它位于一个类中,在一个定义中,我想知道是否可以使用我构建脚本的方式 这是一个相当大的脚本,所以我不想在这里粘贴所有的代码,我希望这将是足够的 基本上,这个类被称为poin(tk.frame),我正在尝试调用从类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):
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上,然后把链接发布到这里。不过,我不能保证明天之前我能看一看。谢谢,我会尝试一下,边做边学是一条路。感谢您的意见!