树莓派下Tkinter的simpledialog对话框显示在主root窗口后方问题求助
解决方案
方案1:改用更通用的置顶无标题栏属性组合
放弃-type dock属性,改用overrideredirect + -topmost的组合实现需求,该组合对轻量窗口管理器的兼容性远高于dock类型定义,可同时满足「无标题栏」「始终置顶」的需求,且子对话框层级逻辑正常:
import tkinter as tk from tkinter import simpledialog, messagebox Root = tk.Tk() # 替换原来的dock属性设置 Root.overrideredirect(True) # 去掉标题栏和窗口边框 Root.attributes('-topmost', True) # 始终置于所有窗口顶部 width = Root.winfo_screenwidth() height = Root.winfo_screenheight() - 30 Root.geometry("%dx%d+0+0" % (width, height)) button = tk.Button(Root, text="exit", command=Root.destroy).pack(pady=20) Root.deiconify() Root.lift() Root.focus_force() J = tk.simpledialog.askfloat("Input", "Number of points per scan:",parent=Root,minvalue=1000, maxvalue=7000) Root.mainloop()
保留-topmost属性即可防止窗口被其他应用遮挡。
方案2:保留dock属性,手动给对话框设置置顶
如果必须使用-type dock属性,可以在弹出对话框前绑定<Map>事件,监听到对话框创建后立刻设置其置顶属性:
import tkinter as tk from tkinter import simpledialog, messagebox Root = tk.Tk() Root.attributes('-type', 'dock') width = Root.winfo_screenwidth() height = Root.winfo_screenheight() - 30 Root.geometry("%dx%d+0+0" % (width, height)) button = tk.Button(Root, text="exit", command=Root.destroy).pack(pady=20) Root.deiconify() Root.lift() Root.focus_force() # 新增:监听对话框创建事件,强制置顶 def set_dialog_topmost(event): if isinstance(event.widget, tk.Toplevel): event.widget.attributes('-topmost', True) Root.bind('<Map>', set_dialog_topmost) J = tk.simpledialog.askfloat("Input", "Number of points per scan:",parent=Root,minvalue=1000, maxvalue=7000) Root.mainloop()
补充配置调整
如果修改代码后仍有问题,可以调整lightdm的窗口层级配置:
- 带默认XFCE桌面的Raspbian可执行
xfconf-query --channel xfwm4 --property /general/raise_on_click --set false,关闭点击窗口自动升起的逻辑 - 其他桌面环境可在窗口管理器设置中关闭「点击焦点窗口自动置顶」的相关选项
内容的提问来源于stack exchange,提问作者Cameron Greenwalt
相关产品推荐
相关产品推荐

