我在Python 3中有一些RGBA数据,我想在不使用任何额外库的情况下在GTK3窗口中显示它所代表的图像.
我尝试的第一件事是编辑一个Pixbuf例子中的数据(http://developer.gnome.org/gdk-pixbuf/stable/gdk-pixbuf-The-GdkPixbuf-Structure.html#put-pixel - 对不起,我使用时,(C)文档中只允许2个链接Pixbuf.get_pixels().这给了我一个不可变的bytes对象,但显然不会起作用.(gdk-pixbuf错误报告(668084,如果SO允许我将链接到它)涵盖相同的功能,但事情必须改变一点,因为.)
接下来,我尝试使用数据创建一个Pixbuf Pixbuf.new_from_data(),但这也是错误的(参见gdk-pixbuf bug 674691)(是的,那是评论3中的我).
然后我看了一下Cairo:ImageSurface.create_for_data应该这样做,但由于某种原因,这在Python 3绑定中还没有.(我已经尝试过使用Python 2,然后将表面转换为a Pixbuf,然后将其包装在一个中gtk.Image,它可以工作.但我使用的是Python3(即便如此,它也很混乱 - 毕竟Cairo是一个矢量图形库) ).
我找到了一个参考,使用PIL将图像写入PNG文件,然后将其读入Pixbuf,但这很糟糕,使用额外的库,而PIL也不适用于Python 3.
那么......还有其他方法吗?
根据Havok的回答,这是一个有效的例子:
from array import array
from gi.repository import Gtk as gtk, GdkPixbuf
pixels = array('H')
for i in range(20):
for j in range(20):
px = (i < 10, j >= 10, (i < 10) ^ (j < 10))
pixels.extend(65535 * c for c in px)
header = b'P6 …Run Code Online (Sandbox Code Playgroud) 在GTK 3中,人们可以设置自己的主题.甚至默认主题(Adwaita)也提供两种变体:浅色和暗色.当我正在编写自己的小部件(在python中)时,我需要获取这些颜色以避免在黑色或白色上绘制黑色.
如何访问用户GTK主题的默认颜色?
GtkSettings 用于提供可接受的gtk-theme-color属性,但它不再存在,并且在文档中没有引用来解释如何替换它.因为原始的颜色在某处.原则上,我没有看到为什么我应该被迫间接访问它.
而且,如果因为你敢在某处删除单个标签而导致程序崩溃,你会如何反应?如果改变单个标签的颜色实际上改变了其他完全不相关的小部件的颜色,你会如何反应?
我不想要这种惊喜.
python的一大优点是能够对方法和函数进行内省.举个例子,要获得函数签名,math.log你可以(在ipython中)运行:
In [1]: math.log?
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function log>
Namespace: Interactive
Docstring:
log(x[, base])
Return the logarithm of x to the given base.
If the base not specified, returns the natural logarithm (base e) of x.
Run Code Online (Sandbox Code Playgroud)
并查看该功能的参数x和可选项base.
使用新的gtk3和自动生成的pygobject绑定,我可以在所有示例中尝试只获取(*args, **kwargs)每个gtk方法的参数.
示例:Label.set_text 需要一个字符串:
In [1]: from gi.repository import Gtk
In [2]: mylabel = Gtk.Label("hello")
In [3]: mylabel.set_text?
Type: instancemethod
Base Class: <type 'instancemethod'>
String Form: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用在PyGObject中具有GtkSourceView小部件的Glade文件.我已经写了一篇关于如何在Glade中使用新的GtkSourceView 3.0的小指南:http://cjenkins.wordpress.com/2012/05/08/use-gtksourceview-widget-in-glade/
问题是当我想从PyGObject加载Glade时:
from gi.repository import Gtk, GtkSource
from os.path import abspath, dirname, join
WHERE_AM_I = abspath(dirname(__file__))
class MyApp(object):
def __init__(self):
self.builder = Gtk.Builder()
self.glade_file = join(WHERE_AM_I, 'test.glade')
self.builder.add_from_file(self.glade_file)
if __name__ == '__main__':
try:
gui = MyApp()
Gtk.main()
except KeyboardInterrupt:
pass
Run Code Online (Sandbox Code Playgroud)
当我运行该文件时,我收到此错误:
Traceback (most recent call last):
File "test.py", line 15, in <module>
gui = MyApp()
File "test.py", line 11, in __init__
self.builder.add_from_file(self.glade_file)
File "/usr/lib/python2.7/dist-packages/gi/types.py", line 43, in function
return info.invoke(*args, **kwargs)
gi._glib.GError: Invalid object type `GtkSourceView'
Run Code Online (Sandbox Code Playgroud)
Glade文件(test.glade)只是一个带有GtkSourceView小部件的窗口: …
如果GSettings模式存在且已编译,则从中读取通常没有问题.但是,如果它不存在,通常会抛出一个无法处理的错误.在Python文件或控制台中尝试:
from gi.repository import Gio
try:
settings = Gio.Settings("com.example.doesnotexist")
except:
print "Couldn't load those settings!"
Run Code Online (Sandbox Code Playgroud)
我正在尽可能广泛地使用except,但这是抛出的错误.
(进程:10248):GLib-GIO-ERROR**:未安装设置架构'com.example.doesnotexist'
我基本上想要做的是找出com.example.doesnotexist架构是否存在; 如果没有,那么告诉用户在使用我的应用程序之前运行我的安装脚本.关于这样做的任何其他建议都是受欢迎的.
我正在尝试在我的Gtk应用程序中转换菜单栏,因此它将使用GActions(来自Gio)而不是GtkActions使用GObject Instrospection的Python3.
我一直试图自己解决这个问题,但到目前为止看起来非常复杂,我没有太多运气.
如果有人可以请发布一个如何创建GAction基于的简单菜单的示例
这对我很有帮助.
编辑:这是我现在在窗口中的菜单栏:

如果有人可以复制使用GioActions显示的菜单项,那么我就可以弄清楚它们是如何工作的,这样会很棒.
顺便说一下,我使用窗口回调的所有操作都不是app回调,所以这是一个窗口菜单栏而不是app菜单栏.
我有一个简单的PyGObject应用程序:
from gi.repository import Gtk
class Window(Gtk.Window):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.set_border_width(5)
self.button = Gtk.Button('Test')
self.box = Gtk.Box()
self.box.pack_start(self.button, True, True, 0)
self.add(self.box)
self.connect('delete-event', Gtk.main_quit)
self.show_all()
win = Window()
Gtk.main()
Run Code Online (Sandbox Code Playgroud)
我试图在Linux上使用cx_freeze使用以下setup.py脚本冻结它:
from cx_Freeze import setup, Executable
setup(name="GUI Test",
description="GUITest",
version="0.1",
options={"build_exe": {"build_exe": "Bin/pygobject",
"create_shared_zip": False,
}},
executables=[Executable(script="hello_pygobject.py",
targetName="hello",
appendScriptToExe=True,
)]
)
Run Code Online (Sandbox Code Playgroud)
而我正在运行它: python3 setup_pygobject.py build
当我尝试运行冻结的应用程序时,我收到以下错误消息:
(process:22538): Gtk-CRITICAL **: gtk_settings_get_for_screen: assertion 'GDK_IS_SCREEN (screen)' failed
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
我可能在目录中缺少一堆库,例如他们已经解释过Windows.我试图pmap找到丢失的库.作为最后的手段,我还尝试将/usr/lib64/(+其他一些我不记得的)的所有库复制到工作目录中.
有一个很好的方法如何找到我需要的库或一些更好的方法来解决它? …
我在GTK 3应用程序中收到以下警告:
Gtk-WARNING**:在
__main__+MCVEWindow 0000000004e93b30不调用gtk_widget_get_preferred_width/height()的情况下分配大小.代码如何知道要分配的大小?
当Gtk.ScrolledWindow包含Gtk.TreeView附加到网格时,会发生警告,网格本身附加到网格上,gtk.ApplicationWindow并且有足够的元素供滚动条实际显示.如果没有足够的元素使其可滚动,则不会出现警告.
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk as gtk
class MCVEWindow(gtk.ApplicationWindow):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._tree_view = gtk.TreeView()
self._tree_view.set_hexpand(True)
self._tree_view.set_vexpand(True)
self.populate_tree_view() # populate tree view with fake items
window_column = gtk.TreeViewColumn(
"Window", gtk.CellRendererText(),
text=0
)
window_column.set_resizable(True)
handle_column = gtk.TreeViewColumn(
"Handle", gtk.CellRendererText(),
text=1
)
class_column = gtk.TreeViewColumn(
"Class name", gtk.CellRendererText(),
text=2
)
self._tree_view.append_column(window_column)
self._tree_view.append_column(handle_column)
self._tree_view.append_column(class_column)
scrolled_tree_view = gtk.ScrolledWindow()
scrolled_tree_view.add(self._tree_view)
toolbar = gtk.Toolbar()
expand_tree_view_button = gtk.ToolButton(icon_name="list-add") …Run Code Online (Sandbox Code Playgroud) 在过去几天的头痛中,我找到了 3 种可能的方法来做到这一点,但所有这些方法都有问题。
PyGObject 的 pip安装由于缺少 Cairo 和可能的其他依赖项而失败。虽然这将是我的首选方法,但它可能是最难实现的。
使用MSYS2允许我通过 mingw64 python 使用 GObject,但使用 pip 获取我的其他模块(如 pylint)失败。无论如何,我想在我的系统上安装 MSYS2 或类似的安装来制作一些 Windows 二进制文件,所以我对此也非常开放。
Windows 版 PyGObject 充其量看起来很混乱,而且不是最新的。无论如何都需要安装第二个 python,比 MSYS2 没有任何好处。
请注意,我是 Unix 的完全新手,一般对 CLI 的经验很少,因此需要像对孩子一样解释有关 MSYS2 的任何帮助。我对这些东西的唯一其他体验涉及到无尽的地狱循环,将 Arch 安装到一个单独的分区,破坏所说的安装,然后再次重新安装。
我也尝试过 Cygwin,但我根本无法通过我的“安装所有需要的包然后祈祷”方法来运行带有 GObject 的 Python。创建一个 Gtk.Window() 导致终端不使用它拥有的任何内存并爆炸。
按照说明操作时2. 入门 — Python GTK+ 3 Tutorial 3.4 文档
尝试
In [6]: import gi
...: gi.require_version('Gtk', '3.0')
...: from gi.repository import Gtk
Run Code Online (Sandbox Code Playgroud)
它报告错误:
~/anaconda3/lib/python3.7/site-packages/gi/__init__.py in require_version(namespace, version)
128 available_versions = repository.enumerate_versions(namespace)
129 if not available_versions:
--> 130 raise ValueError('Namespace %s not available' % namespace)
131
132 if version not in available_versions:
ValueError: Namespace Gtk not available
Run Code Online (Sandbox Code Playgroud)
按照如何安装 GTK+ 3.0?- 询问 Ubuntu并将 Gtk 安装到 ubuntu
sudo apt-get install libgtk-3-dev
Run Code Online (Sandbox Code Playgroud)
但是,它仍然报告相同的错误。
怎么能解决我的问题?
笔记:
尝试了解决方案
me@host:~:
$ sudo apt install …Run Code Online (Sandbox Code Playgroud)