Python 从其他类访问变量-自定义对话框

Python 从其他类访问变量-自定义对话框,python,tkinter,Python,Tkinter,我试图创建一个对话框,从弹出对话框中获取社会保险号(或simular输入),但是当我尝试时,我得到一个错误,表示该类没有该属性。代码如下: from Tkinter import * class App: def __init__(self, master): b = Button(text="Click for social dialog", command=self.getSocial) b.grid(row=0, column=0) def

我试图创建一个对话框,从弹出对话框中获取社会保险号(或simular输入),但是当我尝试时,我得到一个错误,表示该类没有该属性。代码如下:

from Tkinter import *

class App:
    def __init__(self, master):
        b = Button(text="Click for social dialog", command=self.getSocial)
        b.grid(row=0, column=0)
    def getSocial(self):
        d = socialDialog(root)
        print d.social
class socialDialog:
    def __init__(self, master):
        self.top = Toplevel()
        Label(self.top, text='Social Security #: ').grid(row=0, column=0)
        self.entry = Entry(self.top)
        self.entry.grid(row=0, column=1)
        self.entry.focus_set()
        self.top.bind('<Key>', self.formatData)
        self.top.bind('<Return>', self.ok)
    def formatData(self, master):
        currentData = self.entry.get()
        if len(currentData) == 3:
            self.entry.insert(3, '-')
        elif len(currentData) == 6:
            self.entry.insert(6, '-')
        elif len(currentData) > 11:
            self.entry.delete(-1, END)
    def ok(self, master):
        self.social = self.entry.get()
        self.top.destroy()
root = Tk()
app = App(root)
root.mainloop()
从Tkinter导入*
类应用程序:
定义初始(自我,主):
b=按钮(text=“单击社交对话”,command=self.getSocial)
b、 网格(行=0,列=0)
def getSocial(自我):
d=社会对话(根)
打印d.social
班级社会对话:
定义初始(自我,主):
self.top=Toplevel()
Label(self.top,text='Social Security#::').grid(行=0,列=0)
self.entry=entry(self.top)
self.entry.grid(行=0,列=1)
self.entry.focus_set()
self.top.bind(“”,self.formatData)
self.top.bind(“”,self.ok)
def格式数据(自身、主):
currentData=self.entry.get()
如果len(currentData)==3:
self.entry.insert(3“-”)
elif len(当前数据)=6:
self.entry.insert(6“-”)
elif len(当前数据)>11:
self.entry.delete(-1,END)
def正常(自身、主控):
self.social=self.entry.get()
self.top.destroy()
root=Tk()
app=app(根目录)
root.mainloop()

问题在于,您的
socialDialog
类只在按下Return键后分配了
social
属性,该属性调用
ok
方法。因此,当您调用实例化
socialDialog
getSocial
,然后立即访问
social
属性时,
socialDialog
实例中的
social
属性还不存在

我不确定您对这段代码的长期目标是什么,但一个直接的解决办法是更改
getSocial
函数,从而:

def getSocial(self):
    d = socialDialog(root)
    #  print d.social
然后加上

print self.social

确定
方法。

问题是显示对话框后立即执行
打印
,因为对话框不是以模式显示的

要解决此问题,请尝试以下方法:

d = socialDialog(root)
root.wait_window(d.top)
print d.social
但是请注意,如果关闭对话框而不输入任何内容,则仍然会发生错误。要防止出现这种情况,请确保
社交
属性具有默认值:

class socialDialog:
    social = None

这一次我能够弄明白,但是如果您打印错误堆栈跟踪,那么帮助您处理错误就容易多了——它包含有有价值的调试信息!