Python 为什么我不能从不同模块中的类调用此变量?

Python 为什么我不能从不同模块中的类调用此变量?,python,class,user-interface,tkinter,global,Python,Class,User Interface,Tkinter,Global,我已经在Python 3.5中使用了Tkinter。我试图将一个输入框的内容传递给另一个模块,这样我就可以用它做其他事情。我正在制作Tkinter窗口,如下所示: import tkinter as tk class GUI(tk.Tk): def __init__(self): tk.Tk.__init__(self) tk.Label(self,text="Testers Name").grid() self.testers_nam

我已经在Python 3.5中使用了Tkinter。我试图将一个输入框的内容传递给另一个模块,这样我就可以用它做其他事情。我正在制作Tkinter窗口,如下所示:

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()
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
调用
\uuuuu main\uuuu
报告
None
,并且没有错误

我有另一个名为pdf.py的模块,其中有一个调用,当我尝试拉入
report\u name
时失败,如下所示:

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()
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())
我已经在
\uuuu main\uuuu
调用中进行了
gui
全局进出

我在pdf.py中的不同地方都这样做过:

import gui
from gui import *
from gui import gui
from gui import GUI
再加上最后一批电话的排列……什么都不起作用


我可以在它自己的模块中打印它,但我无法让它显示在那里之外。如何执行此操作?

if _; name _;块的整个要点是仅在直接运行该文件时执行其内容,而不是在导入该文件时执行。因此,如果您确实希望导入
gui
实例,则不应在该块中创建它。

不完全确定,但我猜您的问题与以下行有关

if __name__ == "__main__":
这意味着您的类
GUI
没有像在[0]中看到的那样被实例化。移动
GUI
类的创建,即使用以下代码段

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

但是,我强烈建议不要在模块末尾实例化该类,因为每次导入该模块时都会重新实例化该类


EDIT1:

我会这样做:

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()
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()
然后在
pdf.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()
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()
def myFirstPage(画布、文档):
导入gui

gui.start_gui()#-->导入后手动打开gui,使变量与模块同名有时可能是个坏主意。将变量
gui
更改为
app
,但仍然会得到相同的错误:
属性错误:模块“gui”没有属性“app”
毫无疑问!这是我以前尝试过的另一件事,但正如你所说,当它被导入时,另一个tkinter窗口打开,这是不好的。我通过调用
python thiscode.py
(您显示的脚本)来启动这个程序,它有
\uuuuuuu main\uuuuu
功能。正如您所指出的,这是不起作用的,但是我应该怎么做才能启动tkinter窗口,而不是在每次将模块导入另一个模块时重新打开另一个窗口?嘿,Brocolli Rob!我更新了我的答案,见我的**EDIT1**。嗨,托马斯…这看起来更好,但是在调用
pdf.py
之前很久就需要打开GUI了…这仍然会打开GUIHey@BrocolliRob的两个IStance,然后您可以通过
python thiscode.py
直接用GUI调用python脚本,这将打开此GUI的一个实例。此外,我想到,为了拥有一个全局GUI类,还可以使用类属性和方法。