从不同的类访问变量 - 自定义对话框

时间:2013-10-19 19:28:27

标签: python tkinter

我正在尝试创建一个对话框,该对话框将从弹出对话框中获取社会安全号码(或类似输入),但是当我尝试时,我得到一个错误,说该类没有该属性。这是代码:

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()

2 个答案:

答案 0 :(得分:0)

问题是,您的socialDialog课程只有在按后才会分配social属性,这会调用ok方法。因此,当您调用getSocial(实例化socialDialog,然后立即访问social属性时,social实例中的socialDialog属性不存在爱好。

我不确定您对此代码的长期目标是什么,但立即解决方法是立即更改getSocial功能:

def getSocial(self):
    d = socialDialog(root)
    #  print d.social

然后添加

print self.social

ok方法。

答案 1 :(得分:0)

问题是在显示对话框后立即执行print,因为对话框没有以模态显示。

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

d = socialDialog(root)
root.wait_window(d.top)
print d.social

但请注意,如果关闭对话框而未输入任何内容,则仍会出现错误。为防止这种情况,请确保social属性具有默认值:

class socialDialog:
    social = None