在Python Tkinter中使用Toplevel窗口的对话框

时间:2014-10-29 12:35:38

标签: python user-interface tkinter

我编写了一些Tkinter对话框,这些对话框是在mainloop中运行的应用程序中调用的。我的对话框初始化程序通常如下所示:

class OKCANCEL( Toplevel ):
    def __init__( self, parent, title ):
        Toplevel.__init__( self, parent )
        self.parent = parent
        self.title( title )
...

我在我的应用程序中将其称为:

o = OKCANCEL( self.mainWindow, mtext = QUIT_REALLY )

其中self.mainWindow是我的App窗口中的一个Frame(一个继承自Frame的类)。 现在,每当我调用对话框时,会出现一个较小的窗口,然后然后预期的窗口将替换小窗口。显示持续时间很短,然而,这有吸引力是令人讨厌的。 我错过了明显的吗? 有人能指出我的错误吗?

谢谢!

编辑:我刚刚写了一个小例子并尝试重现这种行为,但是,它不存在或发生得太快。我有点困惑,出现的小窗口甚至有一个窗口标题,在代码中找不到(这个页面上没有大的,巨大的代码块)。

# -*- coding: UTF-8 -*-
import os
from Tkinter import *

class WARNING(Toplevel): #ok only dialog
       def __init__(self,parent,wtext,wtitle=''):
            Toplevel.__init__(self,parent)
            self.parent=parent
            self.protocol("WM_DELETE_WINDOW",self._NULL) #we need to include a check again...
            self.title(wtitle)
            self.attributes('-topmost',True)
            self.transient()
            mainWindow=Frame(self)
            tFrame=Frame(mainWindow)
            tLabel=Label(tFrame,text=wtext,height=3,bd=10)
            tLabel.pack()
            bFrame=Frame(mainWindow,bd=5)
            bOK=Button(bFrame,bd=1,text='Ok',command=self._DONE)
            bOK.pack(side='left')
            tFrame.grid(row=0,column=0)
            bFrame.grid(row=1,column=0,sticky=E)
            mainWindow.pack()

        def _DONE(self,Event=None):
            self.destroy()

        def _NULL():
            pass

    class WarnApp(Frame):

        def __init__(self,parent):
            Frame.__init__(self, parent)
            self.parent=parent
            self.initUI()

        def initUI(self):
            self.parent.title("Warning test")
            self.mainWindow = Frame(self.parent)
            B1=Button(self.mainWindow,command=self.Warn,text='Warn-Me')
            B1.pack(fill=BOTH)
            self.mainWindow.pack(fill=BOTH)
            self.pack(fill=BOTH)

        def Warn(self):
            warn=WARNING(self,wtext='This is a warning',wtitle='generic warning dialog')
            self.wait_window(warn)

    def main():
        root=Tk()
        app = WarnApp(root)
        app.mainloop()

    if __name__ == "__main__":
        main()
    `

0 个答案:

没有答案