繁体   English   中英

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

[英]Create a python tkinter window with no X (close) button

我正在编写“向导”型Python Tkinter GUI,该GUI会从用户那里收集信息,然后根据用户的输入执行一些操作:文件复制,数据库更新等。处理过程通常需要30-60秒,在此期间,我想要:

  1. 向用户提供有关活动和进度的文本更新
  2. 阻止用户在应用完成之前关闭应用

我开始将文本更新显示在配置为可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

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

那么...是否可以应用任何创可贴使这种方法按我想要的方式工作? 还是我只需要废弃它,因为它不起作用? (如果是后者,我有什么办法可以实现最初的目标?)

self.dlgWin.overrideredirect(1)将删除所有按钮(创建无边界窗口)。 那是您要找的东西吗?

据我所知,窗口控制按钮是由窗口管理器实现的,所以我认为不可能仅用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')
    # ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM