标签: gtkbuilder

使用glade/Gtkbuilder的自定义小部件

我正在用Gtk和Glade开发一个应用程序.我的印象是,为您的主窗口创建GtkWindow的子类是常见的做法,但我仍然坚持如何从GtkBuilder定义构造我的子类.有谁知道怎么样?

gtk glade gtkbuilder

10
推荐指数
1
解决办法
3560
查看次数

如何用PyGTK/Gtkbuilder重复显示一个Dialog?

我创建了一个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)

python gtk pygtk dialog gtkbuilder

9
推荐指数
1
解决办法
7089
查看次数

GtkBuilder和"名字"

我一直试图在GtkBuilder对象中获取所有GtkWidgets的"名称".

我已经设法通过构建器对象获取所有对象gtk_builder_get_objects()并将它们存储在GSList中.

然而,当我gtk_widget_get_name()在gobjects(我投射到GtkWidgets)上使用时,我获得了通用名称,例如"GtkWindow"和"GtkButton",而不是在glade中显示的"window1"或"button1".

任何帮助都将非常感激,并会让这个程序员非常高兴.

c gtk gtkbuilder

6
推荐指数
2
解决办法
2035
查看次数

使用GtkBuilder自动连接信号时对话框中断,但在手动连接信号时有效

我想要一个对话窗口,其中一些按钮关闭对话框而其他按钮则不关闭.我这样做的方法是使用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)

python gtk pygtk gtkbuilder pygobject

6
推荐指数
1
解决办法
785
查看次数

使用libglade转换为GtkBuilder有哪些步骤?(蟒蛇)

我有一个使用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上.

python pygtk glade gtkbuilder

5
推荐指数
2
解决办法
4051
查看次数

无法为gtk构建器文件GTK + 2设置翻译域

我想国际化我的gtk + 2应用程序.如果我在源代码中使用字符串(_("String")),我可以这样做.我使用xgettext从.ui文件中提取了所有字符串.没关系.我翻译了它.我想使用以下方法为我的界面文件设置文本域:

gtk_builder_set_translation_domain(builder, GETTEXTPATH)
Run Code Online (Sandbox Code Playgroud)

它不起作用.所有字符串都与开头的字符串相同.我正在使用GTK + 2.24.10.我不想在程序中获取所有字符串并使用_().

gtk internationalization gtkbuilder

5
推荐指数
0
解决办法
331
查看次数

带有模板 UI 的自定义 Gtk Widget

我已经使用模板创建了一个自定义 Gtk Widget,并且我想在其他 Gtk Builder 文件上使用它。

我做了什么:

  • 编写了一个 .ui 文件<template class="G3JAMinScenes" parent="GtkBox">
  • 编写小部件源代码(.c/.h)

当我使用小部件按预期工作时创建它时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 gtkbuilder subclassing gtk3

5
推荐指数
1
解决办法
4159
查看次数

gtk.Builder,容器子类和绑定子窗口小部件

我正在尝试在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 gtk bind subclass gtkbuilder

4
推荐指数
1
解决办法
1724
查看次数

如何编写扩展的gtk.CellRendererText()以在文本旁边放置一个图像

我在python和GtkBuilder中做一个简单的文件浏览器.我正在使用一个Treeview,它有一个TreeViewColumn,其单元格呈现如下:

self.cell = gtk.CellRendererText()
Run Code Online (Sandbox Code Playgroud)

正如我提到的,我正在创建一个文件浏览器.所以我想在每个单元格中的文本前面有一个小图标,该图标将是文件夹,文件图标.我怎么能这样做呢?

python gtk pygtk gtkbuilder

4
推荐指数
1
解决办法
287
查看次数

ruby glade/gtkbuilder的例子?

我使用ruby和glade2在新版本的glade3中设计用户界面一段时间我可以使用gtkbuilder格式生成xml文件而不是libglade.

有什么例子吗?我搜索谷歌,但我没有运气!

ruby gtk glade gtkbuilder

3
推荐指数
1
解决办法
5770
查看次数

GTK/C 和 GtkBuilder 制作单个可执行文件

在我的项目中,我调用gtk_builder_add_from_file函数来加载带有之前用 Glade 设计的 ui 对象的 xml 文件。所以,我有我的二进制程序和(在同一文件夹中)xml 文件。

将所有内容打包到单个可执行文件中的最佳方法是什么?我应该使用自解压脚本吗?或者还有其他东西可以一起编译?

谢谢大家

gtkbuilder gtk3

3
推荐指数
1
解决办法
3690
查看次数

在父窗口小部件中居中固定大小的GtkDrawingArea窗口小部件

我有一个林间布局,其中我有一个固定大小的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)

python gtk pygtk glade gtkbuilder

2
推荐指数
1
解决办法
1271
查看次数

在PyGTK/GtkBuilder中处理多个窗口

如何在一个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文件?或者在相同(初始)时间为每个可能的窗口连接信号?

python pygtk glade gtkbuilder

1
推荐指数
1
解决办法
1855
查看次数