我正在基于 debian 的 Linux 中使用 python tkinter 开发一个 GUI。
每当我使用overrideredirect(True)方法删除根和顶级窗口标题栏时我面临下面提到的问题。
- 当我点击输入字段时,输入字段不起作用(未获得焦点/未获得输入)。
- 每当我使用 Alt+Tab 键时,只有它才会获得焦点。
- 然后我必须在单击的位置按住鼠标左键或右键,然后只有输入字段接受输入,否则输入将写入终端窗口。
任何人都可以在基于 Linux 的系统上的 tkinter 中提出一种删除标题栏或隐藏标题栏的替代方法。此代码在 Windows 系统上运行良好。
有一个问题Tkinter's overrideredirect prevents certain events in Mac and Linux这似乎与我的问题相同,但我无法得到它的解决方案。
from tkinter import *
class GuiApp:
def __init__(self,master):
master_frame = Frame(master,background= 'blue')
master_frame.grid()
b1 = Button(master_frame,
height=3,text="BUTTON",width=15, font=14,command=lambda parent=master: self.create_top_window(parent))
b1.grid(row=0, column=0, pady=3, padx=5)
master_frame.grab_set()
def create_top_window(self,parent):
toplevel = Toplevel(parent, bg='red', bd=5, relief=RIDGE)
toplevel.geometry('350x250')
toplevel.wm_overrideredirect(True)
# toplevel.wm_attributes('-type','splash')
label=Label(toplevel,text='Entry:')
entry=Entry(toplevel,width=10,font=13)
button = Button(toplevel, text='close', font=('TkTextFont', 14), command=toplevel.destroy)
label.grid(row=0,column=0,padx=5,pady=5)
entry.grid(row=0,column=1,padx=5,pady=5)
button.grid(row=1, column=0, padx=1, pady=1)
toplevel.grab_set()
root = Tk()
root.wm_overrideredirect(True)
#root.wm_attributes('-type','splash')
app = GuiApp(root)
root.mainloop()
最佳答案
标题栏由窗口管理器提供。当您设置 overrideredirect 标志时,您要求窗口管理器忽略您的窗口,这不仅仅是删除装饰。然而,扩展窗口管理器提示协议(protocol)允许您指定窗口的预期类型(菜单、启动画面、对话框等),并提供一种提示窗口管理器的方法,以便它可以提供合适的装饰。在这种情况下,它听起来像一个启动屏幕,因此您可以尝试使用“splash”作为窗口类型:
self.wm_attributes('-type', 'splash')
仅当 Tk 窗口系统为“x11”时才提供“type”属性。启动提示应该为您摆脱窗口管理器装饰,尽管这取决于窗口管理器配置。
关于tkinter - 在基于 debian 的 Linux 上,tkinter 中的 overrideredirect(True) 方法面临问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52121872/