簡體   English   中英

如何在 Tkinter 中強制注意彈出 window

[英]How to make pop-up window with force attention in Tkinter

我想創建一個 window ,它不允許用戶訪問其他 windows ,直到您提供輸入。 我試過win.attribute("ontop", True)但它允許用戶訪問其他 windows。 or is there any function like a force_focus_lock() in Tkinter python 3.8 which doesn't allow other window to get focus until you give a input or the close present window.

我相信以下是您正在嘗試做的事情。 解釋在評論中給出。

方法 #1: (PopOut1)

  • 你仍然可以移動主 window
  • 如果主 window 上有鼠標釋放,則新的 window 將獲得焦點

方法 #2: (PopOut2)

  • 主 window 鎖定到位
  • 如果主 window 上有鼠標釋放,新的 window 將承擔焦點、閃爍和“叮當”

import tkinter as tk


#first method
class PopOut1(tk.Toplevel):
    def __init__(self, master, **kwargs):
        tk.Toplevel.__init__(self, master, **kwargs)
        self.geometry('400x300')

        #set focus to this window
        self.focus_set()
        
        #releasing on any other tkinter window, within this process, forces focus back to this window
        self.grab_set()


#second method
class PopOut2(tk.Toplevel):
    def __init__(self, master, **kwargs):
        tk.Toplevel.__init__(self, master, **kwargs)
        self.geometry('400x300')
        
        #set focus to this window
        self.focus_set()

        #disable the main window
        master.attributes('-disabled', True)

        #so this window can't end up behind the disabled window
        #only necessary if this window is not transient
        #self.attributes('-topmost', True)

        #capture close event
        self.protocol("WM_DELETE_WINDOW", self.close)

    #event=None ~ in case you also want to bind this to something
    def close(self, event=None):
        #re-enable the main window
        self.master.attributes('-disabled', False)
        #destroy this window
        self.destroy()


class App(tk.Tk):
    TITLE = 'Application'
    WIDTH, HEIGHT, X, Y = 800, 600, 50, 50

    def __init__(self):
        tk.Tk.__init__(self)
        tk.Button(self, text="open popout 1", command=self.open1).grid()
        tk.Button(self, text="open popout 2", command=self.open2).grid()

    def open1(self):
        PopOut1(self)

    def open2(self):
        #.transient(self) ~ 
        #    flash PopOut if focus is attempted on main
        #    automatically drawn above parent
        #    will not appear in taskbar
        PopOut2(self).transient(self)


if __name__ == '__main__':
    app = App()
    app.title(App.TITLE)
    app.geometry(f'{App.WIDTH}x{App.HEIGHT}+{App.X}+{App.Y}')
    #app.resizable(width=False, height=False)
    app.mainloop()

也許創建 2 個 windows 可以完成這項工作:一個是用戶應該輸入內容的地方,另一個是全屏透明且始終在頂部的,這將阻止用戶訪問另一個 windows。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM