为什么我不能从不同模块中的 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] 中所示。移动GUIclass的创建,也就是使用下面的代码片段

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