Python Tkinter顶层窗口不可移动
在我的Tkinter应用程序中,我有一个按钮,可以打开一个顶级窗口,显示事件日志。有几件事我需要Toplevel窗口来完成:Python Tkinter顶层窗口不可移动,python,tkinter,Python,Tkinter,在我的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=无
赛尔夫,大师