簡體   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