Tkinter - 显示没有标题栏和屏幕键盘的全屏应用程序 (Linux)

Tkinter - Displaying a fullscreen app without a title bar and with an on screen keyboard (Linux)

我正在尝试在 raspberry pi 上创建全屏 tkinter 应用程序。该应用程序需要有一个屏幕键盘(它在触摸屏上使用)。我也希望没有标题栏(我不希望人们能够关闭应用程序,而且它看起来更干净)。除了使用 zoomed 属性的标题栏之外,我已经能够使所有这些工作正常,但它不能与我发现的任何其他删除标题栏的方法结合使用。我使用的键盘是基于 raspbian 的 florence raspberry pi 3B+。以下是我尝试过的案例。

Overrideredirect 和 fullscreen 属性不允许屏幕键盘工作(它在应用程序后面打开)。

splash 属性非常接近工作,问题是我的 Entry 小部件不起作用(当我点击它们时,光标不会弹出,我实际上可以返回 python 和光标弹出但输入 python。我认为这是因为应用程序落后于 Python)。这与 root.geometry 结合使用以全屏显示应用程序。

我找到了两个类似的堆栈溢出问题 and 。第一个问题不需要全屏(这是我当前代码所在的位置),第二个不需要键盘。

    root = tk.Tk()
    root.attributes('-zoomed', True)

    #width = root.winfo_screenwidth()
    #height = root.winfo_screenheight()
    #root.geometry("%dx%d+0+0" % (width, height))
    #root.wm_attributes('fullscreen', True)
    #root.overrideredirect(True)
    #root.attributes('-type', 'splash')
    root.mainloop()

有一个解决方法可以使用 splash 属性:您可以将条目上的点击绑定到 entry.focus_force(),这样您就可以输入条目。这是一个小例子:

import tkinter as tk

root = tk.Tk()
root.attributes("-fullscreen", True)
root.attributes("-type", "splash")

root.bind_class("Entry", "<1>", lambda ev: ev.widget.focus_force())

entry = tk.Entry(root)
entry.pack()
tk.Button(root, text="Close", command=root.destroy).pack()
root.mainloop()

注意:我使用了 class 绑定到 tk.Entry:

root.bind_class("Entry", "<1>", lambda ev: ev.widget.focus_force())

使其适用于程序中的所有tk.Entry。但是,如果想要使用不同的 class 小部件,例如ttk.Entry,必须将 class 绑定修改为

root.bind_class(<class name>, "<1>", lambda ev: ev.widget.focus_force())

其中 <class name> 将是 ttk.Entry 的“TEntry”,ttk.Combobox 的“TCombobox”或 tk.Text 的“文本”。