1

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

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

2 回答 2

0

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

要解决此问题,请尝试以下操作:

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

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

class socialDialog:
    social = None
于 2013-10-19T20:11:18.287 回答
0

问题是您的socialDialog类仅在您按下 Return后才social被分配一个属性,这会调用该方法。因此,当您调用实例化 a 的,然后立即访问属性时,实例中的属性还不存在。okgetSocialsocialDialogsocialsocialsocialDialog

我不确定你对这段代码的长期目标是什么,但一个直接的解决方法是改变getSocial函数:

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

然后加

print self.social

ok方法。

于 2013-10-19T19:37:56.950 回答