Tkinter:不要将焦点移动到窗口

时间:2018-06-11 21:31:52

标签: python tkinter

我正在尝试制作屏幕键盘。它适用于窗口中的小部件,但是当我按下按钮时,它会将焦点从我尝试输入的窗口移动到具有按钮的窗口。如何防止python移动?

from tkinter import *
from pynput.keyboard import Key, Controller
keyboard = Controller()

class App:
    def __init__(self, master):
        self.entry = Entry()
        self.buttonOne = Button(text='1')
        self.buttonTwo = Button(text='2')
        self.buttonThree = Button(text='3')
        self.buttonOne.bind("<Button-1>", lambda event, keyPressed='1': self.pressed(event, keyPressed))
        self.buttonTwo.bind("<Button-1>", lambda event, keyPressed='2': self.pressed(event, keyPressed))
        self.buttonThree.bind("<Button-1>", lambda event, keyPressed='3': self.pressed(event, keyPressed))
        self.entry.grid(row=0, column=0, columnspan=3)
        self.buttonOne.grid(row=1, column=0)
        self.buttonTwo.grid(row=1, column=1)
        self.buttonThree.grid(row=1, column=2)
    def pressed(self, event, keyPressed):
        keyboard.press(keyPressed)
        keyboard.release(keyPressed)
root = Tk()
app = App(root)
root.mainloop()

2 个答案:

答案 0 :(得分:1)

我建议使用withdraw()deiconify()。这将使得一旦你在那个窗口上调用它,那么带有按钮的窗口是不可见的。使用deiconify()后,它会将其反转并再次显示。

可以找到更多信息here

答案 1 :(得分:0)

  

问题:不要将焦点移到窗口上

在X11上,您可以设置-type属性:

self.wm_attributes("-type", 'dock')

'dock'将为我工作,而不是抓住焦点,但并非所有窗口管理器都支持。


参考

  • wm attributes

      

    与窗口管理器通信

  • A list of types

      

    -type
      请求窗口管理器将窗口解释为指定的类型。这可能导致窗口以不同的方式进行装饰或以其他方式进行不同的管理,尽管发生的确切情况完全取决于窗口管理器。

         

    'dock'
        表示底座/面板功能,


import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.wm_attributes("-type", 'dock')

        for n in range(64, 68):
            btn = tk.Button(self, text=chr(n), takefocus=0)
            btn.bind("<Button-1>", self.on_click)
            btn.pack()

    def on_click(self, event):
        w = event.widget
        print(w['text'])


if __name__ == '__main__':
    App().mainloop()