我编写了一些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()
`