Python Tkinter顶层窗口不可移动

Python Tkinter顶层窗口不可移动,python,tkinter,Python,Tkinter,在我的Tkinter应用程序中,我有一个按钮,可以打开一个顶级窗口,显示事件日志。有几件事我需要Toplevel窗口来完成: 打开时显示以前的日志项,以及使用新日志项进行更新 禁用用户在周围移动窗口的能力,同时使用户能够关闭窗口 让窗口始终锚定,其右上角位于根窗口的右上角 我已经弄明白了。我可以打开窗口,显示以前的条目,并在窗口打开时更新这些条目。我的问题是2和3 对于#2,我不确定如何禁用用户移动窗口的功能。我假设这也会禁用用户关闭窗口的能力,因此我不确定如何保持该功能完好无损。可能是一个带有

在我的Tkinter应用程序中,我有一个按钮,可以打开一个顶级窗口,显示事件日志。有几件事我需要Toplevel窗口来完成:

  • 打开时显示以前的日志项,以及使用新日志项进行更新
  • 禁用用户在周围移动窗口的能力,同时使用户能够关闭窗口
  • 让窗口始终锚定,其右上角位于根窗口的右上角
  • 我已经弄明白了。我可以打开窗口,显示以前的条目,并在窗口打开时更新这些条目。我的问题是2和3

    对于#2,我不确定如何禁用用户移动窗口的功能。我假设这也会禁用用户关闭窗口的能力,因此我不确定如何保持该功能完好无损。可能是一个带有
    self.quit()
    命令的按钮

    至于#3,我不知道该怎么做。也许我的谷歌搜索很糟糕,但我似乎不知道如何做到这一点

    这就是我目前拥有的代码,它能够正确地实现特性1


    我们可以从
    toplevel
    窗口顶部删除工具栏,并防止用户使用
    self.textWindow.overrideredirect(True)
    移动窗口

    然后,我们可以通过获取根窗口位置,然后将
    toplevel
    窗口设置为与
    self.master.winfo_x()
    self.master.winfo_y()相同的位置,来确保
    toplevel
    窗口位于右上角

    最后,我将添加一个按钮来关闭窗口,因为我们不再有用于
    toplevel
    窗口的工具栏

    更新:我添加了
    toplevel
    窗口保持在根窗口顶部的功能,并在拖动根时随根窗口移动

    我们可以使用
    bind()

    我们还可以使用
    self.textWindow.attributes(“-topmost”,True)
    来告诉tkinter将
    toplevel
    窗口置于所有其他窗口之上

    看看下面代码的修改版本。让我知道你的想法,或者如果你有任何问题

    import tkinter as tk
    
    class guiapp(tk.Frame):
    
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.textWindow = None
            self.master.bind("<Configure>", self.move_me)
            self.value = 0.0
            self.list_for_toplevel = []
            btn = tk.Button(self.master, text = "Click", command = self.TextWindow)
            btn.pack()
    
        def TextWindow(self):
            x = self.master.winfo_x()
            y = self.master.winfo_y()
    
            self.textWindow = tk.Toplevel(self.master)
            self.textFrame = tk.Frame(self.textWindow)
            self.textWindow.overrideredirect(True)
            self.textFrame.pack()
            self.textWindow.attributes("-topmost", True)
    
            self.textWindow.geometry('+{}+{}'.format(x+10, y+30))
            self.close_toplevel = tk.Button(self.textWindow, text = "close", command = self.close_textWindow)
            self.close_toplevel.pack()
            self.textArea = tk.Text(self.textWindow, height = 10, width = 30)
            self.textArea.pack(side = "left", fill = "y")
    
            bar = tk.Scrollbar(self.textWindow)
            bar.pack(side = "right", fill = "y")
            bar.config(command = self.textArea.yview)
            self.alive = True
            self.timed_loop()
    
        def close_textWindow(self):
            self.textWindow.destroy()
            self.textWindow = None
    
        def move_me(self, event):
            if self.textWindow != None:
                x = self.master.winfo_x()
                y = self.master.winfo_y()
                self.textWindow.geometry('+{}+{}'.format(x+10, y+30))
    
        def timed_loop(self):
            if self.textWindow != None:
                self.master.after(1000, self.timed_loop)
                self.value += 1
                self.list_for_toplevel.append(self.value)
                self.textArea.delete(1.0, "end-1c")
                for item in self.list_for_toplevel:
                    self.textArea.insert('end', "{}\n".format(item))
                    self.textArea.see('end')
    
    
    if __name__ == "__main__":
    
        root = tk.Tk()
        root.geometry("800x480")
        myapp = guiapp(root)
        root.mainloop()
    
    将tkinter作为tk导入
    类guiapp(tk.Frame):
    定义初始(自我,主):
    tk.Frame.\uuuuu init\uuuuuuu(自,主)
    self.master=master
    self.textWindow=无
    self.master.bind(“,self.move\u me)
    self.value=0.0
    self.list_for_toplevel=[]
    btn=tk.按钮(self.master,text=“Click”,command=self.TextWindow)
    btn.pack()
    def文本窗口(自):
    x=self.master.winfo_x()
    y=self.master.winfo_y()
    self.textWindow=tk.Toplevel(self.master)
    self.textFrame=tk.Frame(self.textWindow)
    self.textWindow.OverrideDirect(True)
    self.textFrame.pack()
    self.textWindow.attributes(“-top”,True)
    self.textWindow.geometry('+{}+{}'。格式(x+10,y+30))
    self.close\u toplevel=tk.按钮(self.textWindow,text=“close”,command=self.close\u textWindow)
    self.close\u顶级包()
    self.textArea=tk.Text(self.textWindow,高度=10,宽度=30)
    self.textArea.pack(side=“left”,fill=“y”)
    bar=tk.Scrollbar(self.textWindow)
    条形包装(侧边=“右侧”,填充=“y”)
    配置(命令=self.textArea.yview)
    self.alive=True
    self.timed_循环()
    def close_文本窗口(自身):
    self.textWindow.destroy()
    self.textWindow=无
    def move_me(自身、事件):
    如果self.textWindow!=无:
    x=self.master.winfo_x()
    y=self.master.winfo_y()
    self.textWindow.geometry('+{}+{}'。格式(x+10,y+30))
    def定时_循环(自):
    如果self.textWindow!=无:
    self.master.after(1000,self.timed_循环)
    self.value+=1
    self.list\u for\u toplevel.append(self.value)
    self.textArea.delete(1.0,“end-1c”)
    对于顶层的self.list\u中的项目:
    self.textArea.insert('end',“{}\n”.format(item))
    self.textArea.see('end'))
    如果名称=“\uuuuu main\uuuuuuuu”:
    root=tk.tk()
    根几何(“800x480”)
    myapp=guiapp(根)
    root.mainloop()
    
    我们可以从
    toplevel
    窗口顶部移除工具栏,并防止用户使用
    self.textWindow.OverrideDirect(True)
    移动窗口

    然后,我们可以通过获取根窗口位置,然后将
    toplevel
    窗口设置为与
    self.master.winfo_x()
    self.master.winfo_y()相同的位置,来确保
    toplevel
    窗口位于右上角

    最后,我将添加一个按钮来关闭窗口,因为我们不再有用于
    toplevel
    窗口的工具栏

    更新:我添加了
    toplevel
    窗口保持在根窗口顶部的功能,并在拖动根时随根窗口移动

    我们可以使用
    bind()

    我们还可以使用
    self.textWindow.attributes(“-topmost”,True)
    来告诉tkinter将
    toplevel
    窗口置于所有其他窗口之上

    看看下面代码的修改版本。让我知道你的想法,或者如果你有任何问题

    import tkinter as tk
    
    class guiapp(tk.Frame):
    
        def __init__(self, master):
            tk.Frame.__init__(self, master)
            self.master = master
            self.textWindow = None
            self.master.bind("<Configure>", self.move_me)
            self.value = 0.0
            self.list_for_toplevel = []
            btn = tk.Button(self.master, text = "Click", command = self.TextWindow)
            btn.pack()
    
        def TextWindow(self):
            x = self.master.winfo_x()
            y = self.master.winfo_y()
    
            self.textWindow = tk.Toplevel(self.master)
            self.textFrame = tk.Frame(self.textWindow)
            self.textWindow.overrideredirect(True)
            self.textFrame.pack()
            self.textWindow.attributes("-topmost", True)
    
            self.textWindow.geometry('+{}+{}'.format(x+10, y+30))
            self.close_toplevel = tk.Button(self.textWindow, text = "close", command = self.close_textWindow)
            self.close_toplevel.pack()
            self.textArea = tk.Text(self.textWindow, height = 10, width = 30)
            self.textArea.pack(side = "left", fill = "y")
    
            bar = tk.Scrollbar(self.textWindow)
            bar.pack(side = "right", fill = "y")
            bar.config(command = self.textArea.yview)
            self.alive = True
            self.timed_loop()
    
        def close_textWindow(self):
            self.textWindow.destroy()
            self.textWindow = None
    
        def move_me(self, event):
            if self.textWindow != None:
                x = self.master.winfo_x()
                y = self.master.winfo_y()
                self.textWindow.geometry('+{}+{}'.format(x+10, y+30))
    
        def timed_loop(self):
            if self.textWindow != None:
                self.master.after(1000, self.timed_loop)
                self.value += 1
                self.list_for_toplevel.append(self.value)
                self.textArea.delete(1.0, "end-1c")
                for item in self.list_for_toplevel:
                    self.textArea.insert('end', "{}\n".format(item))
                    self.textArea.see('end')
    
    
    if __name__ == "__main__":
    
        root = tk.Tk()
        root.geometry("800x480")
        myapp = guiapp(root)
        root.mainloop()
    
    将tkinter作为tk导入
    类guiapp(tk.Frame):
    定义初始(自我,主):
    tk.Frame.\uuuuu init\uuuuuuu(自,主)
    self.master=master
    self.textWindow=无
    赛尔夫,大师