创建一个没有X(关闭)按钮的python tkinter窗口

时间:2013-06-14 20:57:55

标签: python windows windows-7 python-2.7 tkinter

我正在编写一个'向导'类型的Python Tkinter GUI,它从用户收集信息,然后根据用户的条目执行多个操作:文件复制,数据库更新等。处理通常需要30-60秒那个时候,我想:

  1. 向用户提供有关活动和进度的文本更新
  2. 阻止用户关闭应用程序,直到它完成正在进行的操作
  3. 我开始尝试将文本更新显示在子窗口中,该子窗口配置为trainsient并使用wait_window暂停主循环,直到活动完成。这适用于我创建的其他自定义对话框,它们具有调用窗口destroy方法的确定/取消按钮。基本方法是:

    def myCustomDialog(parent,*args):
        winCDLG = _cdlgWin(parent,*args)
        winCDLG.showWin()
        winCDLG.dlgWin.focus_set()
        winCDLG.dlgWin.grab_set()
        winCDLG.dlgWin.transient(parent)
        winCDLG.dlgWin.wait_window(winCDLG.dlgWin)
        return winCDLG.userResponse
    
    class _cdlgWin():
        def __init__(self,parent,*args):
            self.parent = parent
            self.dlgWin = tk.Toplevel()
            self.userResponse = ''
    
        def showWin(self):
            #Tkinter widgets and geometry defined here
    
        def _btnOKClick(self):
            #self.userResponse assigned from user entry/entries on dialog
            self.dlgWin.destroy()
    
        def _btnCancelClick(self):
            self.dlgWin.destroy()
    

    但是,这种方法不适用于我想要创建的新监视器和更新对话框。

    首先,因为没有用户启动的操作来触发复制/更新活动,然后是destroy,我必须将它们放在showWin或其他方法中。我已经尝试过两种方式,但是我遇到了竞争条件(代码完成了复制/更新的东西,然后试图在它出现之前销毁窗口),并且从不执​​行复制/更新的东西,因为它在我激活其他方法之前点击wait_window

    如果我能找到一条方法,那么第二个问题(防止用户在工作完成之前关闭子窗口)将在下面的答案中介绍。

    所以...有什么样的绑带我可以申请让这种方法按我想要的方式工作吗?或者我需要废弃它,因为它无法正常工作? (如果是后者,有什么方法可以实现最初的目标吗?)

2 个答案:

答案 0 :(得分:5)

self.dlgWin.overrideredirect(1)将删除所有按钮(制作无边框窗口)。这就是你要找的东西吗?

答案 1 :(得分:2)

据我所知,窗口控制按钮是由窗口管理器实现的,所以我认为不可能只用Tkinter删除其中一个(虽然我不是100%肯定)。此问题的常见解决方案是设置对协议WM_DELETE_WINDOW的回调,并使用它来控制窗口的行为:

class _cdlgWin():
    def __init__(self,parent,*args):
        self.parent = parent
        self.dlgWin = tk.Toplevel()
        self.dlgWin.protocol('WM_DELETE_WINDOW', self.close)
        self.userResponse = ''

    def close(self):
        tkMessageBox.showwarning('Warning!',
                                 'The pending action has not finished yet')
    # ...