python - 给定一个 Gtk Notebook,如何将页面拖放到新窗口?
问题描述
就像标题说的那样,我有一个 Gtk Notebook 并希望将一个笔记本页面 DND 到一个新窗口。有人有例子吗?
解决方案
这是一个完整的示例,如何在将页面拖放到当前窗口之外时创建一个窗口,包括如何在笔记本之间进行 DND,以及如何在删除所有页面后销毁子窗口。
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class GUI:
def __init__(self):
self.window = Gtk.Window()
self.window.set_size_request(400, 400)
notebook = Gtk.Notebook()
self.window.add(notebook)
notebook.connect('create-window', self.notebook_create_window)
notebook.set_group_name('0') # very important for DND
for i in range (4):
label = Gtk.Label('label in page number ' + str(i))
tab_label = Gtk.Label('page ' + str(i))
notebook.append_page(label, tab_label)
notebook.set_tab_detachable(label, True)
self.window.show_all()
self.window.connect('destroy', Gtk.main_quit)
def notebook_create_window (self, notebook, widget, x, y):
# handler for dropping outside of current window
window = Gtk.Window()
new_notebook = Gtk.Notebook()
window.add(new_notebook)
new_notebook.set_group_name('0') # very important for DND
new_notebook.connect('page-removed', self.notebook_page_removed, window)
window.connect('destroy', self.sub_window_destroyed, new_notebook, notebook)
window.set_transient_for(self.window)
window.set_destroy_with_parent(True)
window.set_size_request(400, 400)
window.move(x, y)
window.show_all()
return new_notebook
def notebook_page_removed (self, notebook, child, page, window):
#destroy the sub window after the notebook is empty
if notebook.get_n_pages() == 0:
window.destroy()
def sub_window_destroyed (self, window, cur_notebook, dest_notebook):
# if the sub window gets destroyed, push pages back to the main window
# detach the notebook pages in reverse sequence to avoid index errors
for page_num in reversed(range(cur_notebook.get_n_pages())):
widget = cur_notebook.get_nth_page(page_num)
tab_label = cur_notebook.get_tab_label(widget)
cur_notebook.detach_tab(widget)
dest_notebook.append_page(widget, tab_label)
dest_notebook.set_tab_detachable(widget, True)
app = GUI()
Gtk.main()
推荐阅读
- mysql - 不允许 Docker mysqld 绑定操作
- rest-assured - 放心 - 如何在“JSONObject body”中传递对象
- postgresql - postgres:使用特定于每个组条件的条件运行组?
- java - 日期的 Java URL 编码(ZULU 格式)
- email - Opencart : 如何在电子邮件中添加 CC 和 BCC?
- xamarin.ios - 无法使用 Xamarin.iOS 解析 RestSharp.RestClient dotnetStandard2.0 项目
- pug - mixins中的参数太多
- vba - VBA Excel - 根据A列合并合并B列中的单元格
- python - 使用带有 IN 语句的 cx_Oracle (Python 3)
- python - 比较大型数据库