0

我一直在寻找解决方案。stackoverflow 上有很多关于这个问题的帖子,这让我走到了这一步,现在我很难过下一步该去哪里。我需要在 root 上使用停靠属性,因为它需要出现在所有其他窗口之上,并且顶部没有栏。splash 属性几乎可以工作,但是当单击其边框位于应用程序后面的屏幕时,其他窗口也可以在其顶部弹出。由于某种原因,下面的代码在树莓派上不起作用,简单对话框出现在根应用程序后面,所以你根本看不到它。

但是,它适用于我的 linux 笔记本电脑。我唯一能想到的是这是一个窗口管理器问题。根据更多帖子的建议,我查看了文件“/etc/X11/default-display-manager”,我的树莓派正在运行使用 lightdm 管理器的默认 raspbian,而我的笔记本电脑使用 gdm3。通过更多的研究,似乎树莓派很难运行 gdm3。我尝试通过在命令窗口中运行“sudo tasksel”来下载 GNOME(我认为是 gdm3),但它仍然遇到了同样的问题。在这一点上,我愿意尝试几乎任何事情。

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()
J = tk.simpledialog.askfloat("Input", "Number of points per scan:",parent=Root,minvalue=1000, maxvalue=7000)
Root.mainloop()
4

1 回答 1

0

您正在寻找的属性-topmost女巫总是在顶部放置一个窗口(除非有多个窗口topmost),窗口管理器有两种z-axis,层按级别重叠,层项按焦点历史重叠。

import tkinter as tk

class App_Dialog(tk.Tk):

    def dial_return(self):
        self.callback(
            self.entry.get()
        )

    def __init__(self, text, callback, master):
        tk.Tk.__init__(self)
        mw, mh = master.winfo_width(), master.winfo_height()
        self.geometry('300x200+{0}+{1}'.format(
            (mw // 2) - 150, (mh // 2) - 100
        ))
        self.attributes('-topmost', True)
        self.overrideredirect(True)
        self.config(bg='#A0A0A0')
        self.callback = callback
        self.update()

        tk.Label(self, text=text).pack(anchor=tk.CENTER)
        self.entry = tk.Entry(self)
        self.entry.pack(anchor=tk.CENTER)
        tk.Button(
            self, text='Save', command=self.dial_return
        ).pack(anchor=tk.CENTER)


class App(tk.Tk):

    def dialog_callback(self, text):
        self.list.insert(0, text)
        self._dialog.destroy()
        self._dialog = None

    def dialog(self, text, callback):
        if self._dialog is None:
            self._dialog = App_Dialog(
                text, callback, self
            )

    def quit(self):
        if self._dialog is not None:
            self._dialog.quit()
        self.tk.quit()

    def __init__(self):
        tk.Tk.__init__(self)
        self.overrideredirect(True)
        self.state('zoomed')

        self.list = tk.Listbox()
        self._dialog = None

        self.b_top = tk.Button(
            self, text='tk::top',
            command=lambda: self.dialog(
                'Fill this:', self.dialog_callback
            )
        )
        self.b_quit = tk.Button(
            self, text='Close',
            command=lambda: self.quit()
        )
        self.b_top.pack(anchor=tk.CENTER)
        self.b_quit.pack(anchor=tk.CENTER)
        self.list.pack(anchor=tk.CENTER)

if __name__ == '__main__':
    app = App()
    app.mainloop()
于 2021-10-04T15:38:43.033 回答