基于Debian的Linux中Tkinter中的overrideredirect(True)方法面临的问题

时间:2018-08-31 19:50:51

标签: tk

我正在基于debian的linux中使用python tkinter开发 GUI

每当我使用 overrideredirect(True)方法删除根目录和顶层窗口标题栏时,我都会遇到以下提到的问题

  1. 输入字段不起作用(没有获得焦点/没有得到输入)。
  2. 每当我使用Alt + Tab键时,只有它会被聚焦。
  3. 然后我必须在单击的位置上按住鼠标左键或右键,然后只有输入字段才能接受输入,否则输入将写在终端窗口上。

在基于linux的系统上,任何人都可以提出删除标题栏或隐藏标题栏的另一种方法。此代码在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()

1 个答案:

答案 0 :(得分:0)

标题栏由窗口管理器提供。设置overrideredirect标志时,您正在要求窗口管理器忽略不仅仅删除装饰的窗口。但是,扩展窗口管理器提示协议允许您指定窗口的预期类型(菜单,启动画面,对话框等),并提供一种提示窗口管理器的方式,以便它可以提供适当的装饰。在这种情况下,它听起来像一个启动屏幕,因此您可以尝试使用“启动”作为窗口类型:

self.wm_attributes('-type', 'splash')

仅当Tk窗口系统为'x11'时才提供'type'属性。初始提示应该为您摆脱窗口管理器装饰,尽管这取决于窗口管理器配置。