![gtk3 窗口未正确重绘](https://linux22.com/image/818366/gtk3%20%E7%AA%97%E5%8F%A3%E6%9C%AA%E6%AD%A3%E7%A1%AE%E9%87%8D%E7%BB%98.png)
我正在创建一个简单的 GTK3 应用程序。主顶层窗口有一个搜索按钮将显示另一个顶层 gtk3 窗口。当我单击第二个 gtk3 窗口上的关闭按钮(靠近标题栏)时,它会按预期关闭。但是,当我再次单击搜索按钮时,第二个顶层窗口不会重新绘制其所有小部件,而是显示为空。
另一方面,如果我点击关闭按钮(底部的 gtk 按钮),它会正常关闭。重新打开时,可以看到所有小部件。
信息:我使用 Glade 创建了 UI。
代码如下所示。但是要获取 UI 文件,您需要下载软件包。您可以下载它们这里
#! /usr/bin/env python
from gi.repository import Gtk
import os,sys
UI_FILE = "main.ui"
SECOND_UI_FILE = "second.ui"
class SampleApp:
def __init__(self):
self.builder = Gtk.Builder()
self.builder.add_from_file(UI_FILE)
self.builder.connect_signals(self)
self.builder2 = Gtk.Builder()
self.builder2.add_from_file(SECOND_UI_FILE)
self.builder2.connect_signals(self)
self.window = self.builder.get_object('window')
self.window.set_position(Gtk.WindowPosition.CENTER)
self.window.connect("destroy", self.destroy)
self.window.show_all()
self.search = self.builder.get_object('button1')
self.search.connect("clicked", self.search_clicked)
def destroy(self, window):
Gtk.main_quit()
def search_clicked(self, window):
self.secondwindow = self.builder2.get_object('window1')
self.secondwindow.show_all()
def main():
app = SampleApp()
Gtk.main()
if __name__ == "__main__":
main()
主窗口
第二个窗口 - 顶层
第二个窗口 - 空白
为什么会发生这种情况?我该如何解决?
答案1
好的,您的代码的作用是让第二个窗口被销毁。之后它就消失了。
您可以通过在方法末尾添加以下两行来防止窗口被销毁(而是隐藏它)init
:
secondwindow = self.builder2.get_object('window1')
secondwindow.connect('delete-event', lambda w, e: w.hide() or True)
取代了删除事件(文档在这里)。
或者您可以在每次打开窗口时重新创建窗口,只需将这些行放在方法的开头即可search_clicked
:
self.builder2 = Gtk.Builder()
self.builder2.add_from_file(SECOND_UI_FILE)
self.builder2.connect_signals(self)