我正在用Gtk和Glade开发一个应用程序.我的印象是,为您的主窗口创建GtkWindow的子类是常见的做法,但我仍然坚持如何从GtkBuilder定义构造我的子类.有谁知道怎么样?
我创建了一个PyGTK应用程序,当用户按下按钮时会显示一个Dialog.该对话框在我的__init__
方法中加载:
builder = gtk.Builder()
builder.add_from_file("filename")
builder.connect_signals(self)
self.myDialog = builder.get_object("dialog_name")
Run Code Online (Sandbox Code Playgroud)
在事件处理程序中,对话框随命令一起显示self.myDialog.run()
,但这只能运行一次,因为在run()
对话框被自动销毁之后.如果我再次单击该按钮,应用程序将崩溃.
我读到有一种方法可以使用show()
而不是run()
对话框没有被销毁的地方,但我觉得这对我来说不是正确的方法因为我希望对话框能够以模态方式运行并且仅在用户之后将控制权返回给代码关闭了它.
有没有一种简单的run()
方法可以使用gtkbuilder 使用该方法重复显示对话框?我尝试使用gtkbuilder重新加载整个对话框,但这似乎没有用,对话框缺少所有子元素(我更喜欢在程序开始时只使用构建器一次).
[解决方案](编辑)
正如下面的答案所指出的那样,使用hide()
诀窍.我首先想到你仍然需要捕捉"删除事件",但这实际上没有必要.一个有效的简单示例是:
import pygtk
import gtk
class DialogTest:
def rundialog(self, widget, data=None):
self.dia.show_all()
result = self.dia.run()
self.dia.hide()
def destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", self.destroy)
self.dia = gtk.Dialog('TEST DIALOG', self.window,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
self.dia.vbox.pack_start(gtk.Label('This is just a Test'))
self.button = gtk.Button("Run Dialog")
self.button.connect("clicked", self.rundialog, None)
self.window.add(self.button)
self.button.show()
self.window.show() …
Run Code Online (Sandbox Code Playgroud) 我一直试图在GtkBuilder对象中获取所有GtkWidgets的"名称".
我已经设法通过构建器对象获取所有对象gtk_builder_get_objects()
并将它们存储在GSList中.
然而,当我gtk_widget_get_name()
在gobjects(我投射到GtkWidgets)上使用时,我获得了通用名称,例如"GtkWindow"和"GtkButton",而不是在glade中显示的"window1"或"button1".
任何帮助都将非常感激,并会让这个程序员非常高兴.
我想要一个对话窗口,其中一些按钮关闭对话框而其他按钮则不关闭.我这样做的方法是使用response
来自对话框的Gtk.Dialog
调用信号emit_stop_by_name('response')
.(如果有人知道这样做的更好方法,那么可能会抢占这个问题的其余部分.)
这在我使用PyGTK时起作用了.我现在正在转向PyGObject ..似乎这种技术只有在我手动连接到响应信号而不是使用时才能工作Gtk.Builder.connect_signals()
.
但是不要相信我的话.这是我的问题的最小例子:
from gi.repository import Gtk
xml = """<interface>
<object class="GtkDialog" id="dialog1">
<signal name="response" handler="on_response"/>
<child internal-child="vbox">
<object class="GtkBox" id="dialog-vbox1">
<child internal-child="action_area">
<object class="GtkButtonBox" id="dialog-action_area1">
<child>
<object class="GtkButton" id="button1">
<property name="label">Don't Close Dialog</property>
<property name="visible">True</property>
</object>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label">Close Dialog</property>
<property name="visible">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">button1</action-widget>
<action-widget response="-6">button2</action-widget>
</action-widgets>
</object>
</interface>
"""
def on_button_clicked(widget):
d = DummyDialog()
d.dialog1.run()
d.dialog1.destroy() …
Run Code Online (Sandbox Code Playgroud) 我有一个使用libglade的小项目,并使用以下内容加载xml文件:
self.gladefile = "sdm.glade"
self.wTree = gtk.glade.XML(self.gladefile)
self.window = self.wTree.get_widget("MainWindow")
if (self.window):
self.window.connect("destroy", gtk.main_quit)
dic = { "on_button1_clicked" : self.button1_clicked,
"on_MainWindow_destroy" : gtk.main_quit}
self.wTree.signal_autoconnect(dic)
Run Code Online (Sandbox Code Playgroud)
在林间空地转换我的项目后,我需要做出哪些结构性变化?我在Ubuntu 9.04上.
我想国际化我的gtk + 2应用程序.如果我在源代码中使用字符串(_("String")),我可以这样做.我使用xgettext从.ui文件中提取了所有字符串.没关系.我翻译了它.我想使用以下方法为我的界面文件设置文本域:
gtk_builder_set_translation_domain(builder, GETTEXTPATH)
Run Code Online (Sandbox Code Playgroud)
它不起作用.所有字符串都与开头的字符串相同.我正在使用GTK + 2.24.10.我不想在程序中获取所有字符串并使用_().
我已经使用模板创建了一个自定义 Gtk Widget,并且我想在其他 Gtk Builder 文件上使用它。
我做了什么:
<template class="G3JAMinScenes" parent="GtkBox">
当我使用小部件按预期工作时创建它时g3jamin_scenes_new
,问题是我想使用 Gtk Builder 将其添加为窗口的子级,所以我写道:
...
<child>
<object class="G3JAMinScenes" parent="GtkBox" id="scnes">
</object>
</child>
...
Run Code Online (Sandbox Code Playgroud)
但当我尝试运行时它会抛出错误:
Gtk-CRITICAL **: Error building template class 'G3JAMinAppWindow' for an instance of type 'G3JAMinAppWindow': Invalid object type `G3JAMinScenes'
Run Code Online (Sandbox Code Playgroud) 我正在尝试在gtk.Builder定义文件中使用自定义容器小部件.就实例化这些小部件而言,它非常有用:
#!/usr/bin/env python
import sys
import gtk
class MyDialog(gtk.Dialog):
__gtype_name__ = "MyDialog"
if __name__ == "__main__":
builder = gtk.Builder()
builder.add_from_file("mydialog.glade")
dialog = builder.get_object("mydialog-instance")
dialog.run()
Run Code Online (Sandbox Code Playgroud)
现在问题是说我在该对话框中有一个gtk.TreeView小部件.我试图弄清楚如何将该窗口小部件绑定到MyDialog实例变量.
我能想到的一个便宜的替代方案是在获取对话框小部件后调用其他方法,如下所示:
dialog = builder.get_object("mydialog-instance")
dialog.bind_widgets(builder)
Run Code Online (Sandbox Code Playgroud)
但这似乎相当尴尬.有没有人已经解决了这个问题,或者对如何去做有更好的想法?
谢谢,
我在python和GtkBuilder中做一个简单的文件浏览器.我正在使用一个Treeview,它有一个TreeViewColumn,其单元格呈现如下:
self.cell = gtk.CellRendererText()
Run Code Online (Sandbox Code Playgroud)
正如我提到的,我正在创建一个文件浏览器.所以我想在每个单元格中的文本前面有一个小图标,该图标将是文件夹,文件图标.我怎么能这样做呢?
我使用ruby和glade2在新版本的glade3中设计用户界面一段时间我可以使用gtkbuilder格式生成xml文件而不是libglade.
有什么例子吗?我搜索谷歌,但我没有运气!
在我的项目中,我调用gtk_builder_add_from_file
函数来加载带有之前用 Glade 设计的 ui 对象的 xml 文件。所以,我有我的二进制程序和(在同一文件夹中)xml 文件。
将所有内容打包到单个可执行文件中的最佳方法是什么?我应该使用自解压脚本吗?或者还有其他东西可以一起编译?
谢谢大家
我有一个林间布局,其中我有一个固定大小的GtkDrawingArea.层次结构的当前相关部分是:
GtkWindow > GtkVBox > GtkHPaned > GtkViewport > GtkAlignment > GtkFixed > GtkDrawingArea
Run Code Online (Sandbox Code Playgroud)
目前,GtkFixed小部件绘制在GtkViewport的左上角.
但是,如果GtkFixed(以及它唯一的子GtkDrawingArea)在GtkViewport中居中(当然,当小部件被压缩到不适合其内容和滚动条的点时,我真的很喜欢它)出现).
实现这一目标的最佳方法是什么?(我正在使用pygtk来做实际的应用程序逻辑,但这应该是一般的gtk问题)
以下是代表性代码示例:
import gtk
class Controller:
def on_window1_destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file("sample.glade")
self.window = self.builder.get_object("window1")
self.builder.connect_signals(self)
def on_drawingarea1_expose_event(self, widget, event):
cr = widget.window.cairo_create()
cr.set_source_rgb(0,0,0)
cr.paint()
return True
if __name__ == "__main__":
client = Controller()
client.window.show()
gtk.main()
Run Code Online (Sandbox Code Playgroud)
以及具有相同问题的示例glade文件:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="window1">
<signal name="destroy" handler="on_window1_destroy"/>
<child>
<object class="GtkVBox" id="vbox1">
<property …
Run Code Online (Sandbox Code Playgroud) 如何在一个GtkBuilder文件中存储多个不同的窗口/对话框,然后在不同的类中加载这些窗口(每个类对应一个不同的窗口)?例如,目前我正在做的事情如下:
def __init__(self):
self.builder = gtk.Builder()
self.builder.add_from_file('gtkbuilder.xml')
self.welcome_dialog = self.builder.get_object('welcome_dialog')
self.builder.connect_signals(self)
self.welcome_dialog.show()
Run Code Online (Sandbox Code Playgroud)
这确实产生了一个功能很强的软件,但是它会发出各种各样的警告:
welcome_dialog.py:38: RuntimeWarning: missing handler 'on_contract_window_response'
self.builder.connect_signals(self)
Run Code Online (Sandbox Code Playgroud)
对于我在Glade中为所有其他窗口定义的每个信号处理程序.我想我想做的就是连接这个单一窗口/对话框的信号并忽略其他一切,但我不知道该怎么做.或者也许我正在做一些可怕的错误,我应该将每个窗口拆分成不同的GtkBuilder文件?或者在相同(初始)时间为每个可能的窗口连接信号?