我有一个框架,我想从中创建一个顶级窗口。我想要创建一个类似于网络浏览器界面的系统。例如,在Google Chrome中,您可以将一个标签拖出来并创建一个新窗口。您还可以将其他标签添加到该新窗口中。这就是我试图“演示”这种行为的方式:
注意:此代码通过按下Tab键来工作,而不是拖动它。
我想知道是否可以通过使用wm_manage来调整创建的窗口。这个函数返回None,并且不像我想象的那样工作,但足够接近我所需要的。
如果不能通过使用wm_manage来实现,我应该怎么做呢?
我想我可以创建一个自定义类,例如从Frame开始,但是有一个问题:新窗口应该与创建它的框架相同。如果用户更改了某些内容,例如向Entry添加了文本;标记了一些checkbuttons;如果他使用了Treeview层次结构,就像这样:
![](https://istack.dev59.com/yzIDx.webp)
新窗口应该记住哪些“文件夹”是打开的(在图片上标记为减号),当前选择了哪些项目等等。这只是关于Treeview的事情,对于每个小部件都应该考虑类似的事情。工作量相当大,所以也许有更好的方法来解决这个问题。
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
moving_frame = tk.Frame()
moving_frame.pack()
notebook = ttk.Notebook(moving_frame, width=400, height=700)
notebook.pack()
movingFrame = tk.Frame(notebook, bg='green', width=400, height=700)
movingFrame2 = tk.Frame(notebook, bg='green', width=400, height=700)
lab = tk.Label(movingFrame, text='some text')
ent = tk.Entry(movingFrame)
ent2 = tk.Entry(movingFrame2, width=10, bg='grey30')
lab.pack()
ent.pack()
ent2.pack()
notebook.add(movingFrame, sticky='nesw', text='tab1')
notebook.add(movingFrame2, sticky='nesw', text='tab2')
def window_create(e):
if notebook.identify(e.x, e.y):
print('tab_pressed')
frame_to_window = root.nametowidget(notebook.select())
root.wm_manage(frame_to_window)
notebook.bind('<ButtonRelease-1>', window_create)
root.mainloop()
注意:此代码通过按下Tab键来工作,而不是拖动它。
我想知道是否可以通过使用wm_manage来调整创建的窗口。这个函数返回None,并且不像我想象的那样工作,但足够接近我所需要的。
如果不能通过使用wm_manage来实现,我应该怎么做呢?
我想我可以创建一个自定义类,例如从Frame开始,但是有一个问题:新窗口应该与创建它的框架相同。如果用户更改了某些内容,例如向Entry添加了文本;标记了一些checkbuttons;如果他使用了Treeview层次结构,就像这样:
![](https://istack.dev59.com/yzIDx.webp)
新窗口应该记住哪些“文件夹”是打开的(在图片上标记为减号),当前选择了哪些项目等等。这只是关于Treeview的事情,对于每个小部件都应该考虑类似的事情。工作量相当大,所以也许有更好的方法来解决这个问题。
wm_manage
不允许我调整那个新窗口。例如,我想在它上面使用overrideredirect
或者使用geometry
,但似乎都无法实现。 - Danya Kroot.call('wm', 'geometry', frame_to_window, "500x500")
作为例子。所以tcl代码对于这个问题是有效的,而且写一个包装器应该不太难。此外,通过一些工作,将该框架的内容重新排列到新的窗口中的Notebook框架中也是可能的。但是,你仍然无法将一个选项卡从一个窗口移动到另一个窗口。 - Thingamabobsroot.call
。我从来没有想到这会起作用,尽管我知道call
和eval
的存在。现在我开心了十倍。甚至overrideredirect
现在也能正常工作!关于 你不能将一个标签从一个窗口移动到另一个窗口,我会先自己尝试测试一下,看看为什么你认为它不会起作用,因为我现在没有看到任何问题。 - Danya K