为什么我不能从不同模块中的 class 调用这个变量?
why can i not call this variable from a class in a different module?
我有这个 Tkinter 东西与 Python 3.5 一起使用。我正在尝试将输入框的内容传递给另一个模块,以便我可以用它做其他事情。我正在像这样制作 Tkinter window:
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Label(self,text="Testers Name").grid()
self.testers_name = tk.Entry(self,text="Testers Name").grid()
tk.Label(self,text="Report Name").grid()
self.report_name = tk.Entry(self,text="Report Name").grid()
submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons)
submitButton.grid()
def query_checkbuttons(self):
some_stuff_blah_blah_blah
if __name__ == "__main__":
gui = GUI()
print(gui.report_name)
gui.mainloop()
所以,这没问题。至少 __main__
中的 print
调用报告 None
而不是错误。
我有另一个名为 pdf.py 的模块,其中有一个调用失败,当我尝试像这样拉入 report_name
时:
def myFirstPage(canvas, doc):
import gui
print(gui.report_name)
canvas.saveState()
canvas.setFont('Times-Bold',16)
canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
canvas.setFont('Times-Roman',9)
canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
canvas.restoreState()
我已经尝试了所有我能想到的。让我们看看,怎么样:
print(gui.gui.report_name)
print(gui.report_name)
print(gui.report_name.get())
print(gui.GUI.report_name)
print(gui.GUI().report_name)
print(gui.GUI().report_name.get())
我已经在 __main__
调用中进行了 gui
全局调用。
我在 pdf.py 的不同地方做过这个:
import gui
from gui import *
from gui import gui
from gui import GUI
结合最后一系列调用的排列...没有任何效果。
我可以打印它在它自己的模块中找到的内容,但我无法让它显示在该模块之外。我该怎么做?
if __name__
块的重点是仅当该文件直接 运行 时才执行其内容,而不是在导入时执行。因此,如果您 想要导入 gui
实例,则不应在该块内创建它。
不完全确定,但我想您的问题与以下行有关
if __name__ == "__main__":
表示您的 class GUI
未实例化,如 [0] 中所示。移动GUI
class的创建,也就是使用下面的代码片段
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Label(self,text="Testers Name").grid()
self.testers_name = tk.Entry(self,text="Testers Name").grid()
tk.Label(self,text="Report Name").grid()
self.report_name = tk.Entry(self,text="Report Name").grid()
submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons)
submitButton.grid()
def query_checkbuttons(self):
some_stuff_blah_blah_blah
gui = GUI()
print(gui.report_name)
gui.mainloop()
至少允许您从该模块导入变量 gui
。
但是,我强烈建议不要实例化模块末尾的 class,因为每次导入该模块时它都会重新实例化!
编辑 1:
我会这样做:
thiscode.py
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Label(self,text="Testers Name").grid()
self.testers_name = tk.Entry(self,text="Testers Name").grid()
tk.Label(self,text="Report Name").grid()
self.report_name = tk.Entry(self,text="Report Name").grid()
submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons)
submitButton.grid()
def query_checkbuttons(self):
some_stuff_blah_blah_blah
def start_gui():
gui = GUI()
# print(gui.report_name)
gui.mainloop()
if __name__ == "__main__":
start_gui()
然后在pdf.py
def myFirstPage(canvas, doc):
import gui
gui.start_gui() # --> manually open up the gui after import <--
# print(gui.report_name)
canvas.saveState()
canvas.setFont('Times-Bold',16)
canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
canvas.setFont('Times-Roman',9)
canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
canvas.restoreState()
现在让我澄清一下,当您通过 python thiscode.py
调用 thiscode.py
时,您最终只会打开一个 GUI。然而,如果您导入模块,则情况并非如此,如 pdf.py
中所示。因此,我们通过必须手动完成的函数调用直接实例化一个 GUI 对象(参见第 3 行,在 pdf.py
中带有明确无误的内联注释)。
[0] https://docs.python.org/3/tutorial/modules.html#executing-modules-as-scripts
我有这个 Tkinter 东西与 Python 3.5 一起使用。我正在尝试将输入框的内容传递给另一个模块,以便我可以用它做其他事情。我正在像这样制作 Tkinter window:
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Label(self,text="Testers Name").grid()
self.testers_name = tk.Entry(self,text="Testers Name").grid()
tk.Label(self,text="Report Name").grid()
self.report_name = tk.Entry(self,text="Report Name").grid()
submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons)
submitButton.grid()
def query_checkbuttons(self):
some_stuff_blah_blah_blah
if __name__ == "__main__":
gui = GUI()
print(gui.report_name)
gui.mainloop()
所以,这没问题。至少 __main__
中的 print
调用报告 None
而不是错误。
我有另一个名为 pdf.py 的模块,其中有一个调用失败,当我尝试像这样拉入 report_name
时:
def myFirstPage(canvas, doc):
import gui
print(gui.report_name)
canvas.saveState()
canvas.setFont('Times-Bold',16)
canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
canvas.setFont('Times-Roman',9)
canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
canvas.restoreState()
我已经尝试了所有我能想到的。让我们看看,怎么样:
print(gui.gui.report_name)
print(gui.report_name)
print(gui.report_name.get())
print(gui.GUI.report_name)
print(gui.GUI().report_name)
print(gui.GUI().report_name.get())
我已经在 __main__
调用中进行了 gui
全局调用。
我在 pdf.py 的不同地方做过这个:
import gui
from gui import *
from gui import gui
from gui import GUI
结合最后一系列调用的排列...没有任何效果。
我可以打印它在它自己的模块中找到的内容,但我无法让它显示在该模块之外。我该怎么做?
if __name__
块的重点是仅当该文件直接 运行 时才执行其内容,而不是在导入时执行。因此,如果您 想要导入 gui
实例,则不应在该块内创建它。
不完全确定,但我想您的问题与以下行有关
if __name__ == "__main__":
表示您的 class GUI
未实例化,如 [0] 中所示。移动GUI
class的创建,也就是使用下面的代码片段
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Label(self,text="Testers Name").grid()
self.testers_name = tk.Entry(self,text="Testers Name").grid()
tk.Label(self,text="Report Name").grid()
self.report_name = tk.Entry(self,text="Report Name").grid()
submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons)
submitButton.grid()
def query_checkbuttons(self):
some_stuff_blah_blah_blah
gui = GUI()
print(gui.report_name)
gui.mainloop()
至少允许您从该模块导入变量 gui
。
但是,我强烈建议不要实例化模块末尾的 class,因为每次导入该模块时它都会重新实例化!
编辑 1:
我会这样做:
thiscode.py
import tkinter as tk
class GUI(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Label(self,text="Testers Name").grid()
self.testers_name = tk.Entry(self,text="Testers Name").grid()
tk.Label(self,text="Report Name").grid()
self.report_name = tk.Entry(self,text="Report Name").grid()
submitButton = tk.Button(self, text="Test Selected",command=self.query_checkbuttons)
submitButton.grid()
def query_checkbuttons(self):
some_stuff_blah_blah_blah
def start_gui():
gui = GUI()
# print(gui.report_name)
gui.mainloop()
if __name__ == "__main__":
start_gui()
然后在pdf.py
def myFirstPage(canvas, doc):
import gui
gui.start_gui() # --> manually open up the gui after import <--
# print(gui.report_name)
canvas.saveState()
canvas.setFont('Times-Bold',16)
canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
canvas.setFont('Times-Roman',9)
canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
canvas.restoreState()
现在让我澄清一下,当您通过 python thiscode.py
调用 thiscode.py
时,您最终只会打开一个 GUI。然而,如果您导入模块,则情况并非如此,如 pdf.py
中所示。因此,我们通过必须手动完成的函数调用直接实例化一个 GUI 对象(参见第 3 行,在 pdf.py
中带有明确无误的内联注释)。
[0] https://docs.python.org/3/tutorial/modules.html#executing-modules-as-scripts