我正在写一个基于GTK的聊天,想要实现以下内容:
在GtkTextView中点击Enter时发送一条消息,但按Shift + Enter键入一个新行.
我只是无法弄清楚如何检测多键按下.我只能通过GdkEventKey检测到一个密钥.
我有一个使用Cairo 图像表面的小型 PyGI 项目,然后我使用表面图案进行缩放并在 Gtk.DrawingArea 上渲染。
我想将缩放版本写入PNG 文件。我试图用Surface.write_to_png()从原始表面写入,但它只写入原始(即非缩放)大小,所以我被困在那里。
然后我想我也许可以从 Gtk.DrawingArea 获取渲染图像并将其写入磁盘,但我还没有找到如何在 PyGI 中做到这一点(这似乎只能在 GTK+ 2 中实现 -将 gtk.DrawingArea 保存到文件)。所以我想弄清楚如何将缩放后的图像写入磁盘。
这是创建表面、放大并渲染它的代码:
def on_drawingarea1_draw (self, widget, ctx, data=None):
# 'widget' is a Gtk.DrawingArea
# 'ctx' is the Cairo context
text = self.ui.entry1.get_text()
if text == '':
return
# Get the data and encode it into the image
version, size, im = qrencode.encode(text)
im = im.convert('RGBA') # Cairo expects RGB
# Create a …Run Code Online (Sandbox Code Playgroud) 我正在尝试一个简单的Perl GtK,gui只包含一个窗口和一个垂直框.我得到一个分段错误,在此之前有一个警告:"无法创建抽象(非实例化)类型的实例'GtkBox'"
GUI是:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Text to EPUB</property>
<child>
<object class="GtkBox" id="box1">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</object>
</interface>
Run Code Online (Sandbox Code Playgroud)
代码是:
#!/usr/bin/perl
use warnings;
use strict;
use File::Spec::Functions qw(rel2abs);
use File::Basename;
use File::Copy;
use Glib;
use Gtk2 '-init';
my $basedir = dirname(rel2abs($0));
my $guifile = "$basedir/txt2epub1.gui";
print "GUI file: $guifile\n";
my $builder = Gtk2::Builder->new();
$builder->add_from_file($guifile) or die "Couldn't …Run Code Online (Sandbox Code Playgroud) 我想在gtk + cairo绘图区域内绘制一些线条(实际上是正弦波),但我无法想出办法.所以我的代码首先定义了绘图区域,该绘图区域有一个函数回调函数,该函数将白色背景绘制到绘图区域本身......此时我想在每次START按钮之后开始绘制一段sin波.按下(按钮有一个回调绘图功能)....所以首先......有可能这样做吗?我错过了什么?谢谢.
#include <cairo.h>
#include <gtk/gtk.h>
int x = 0;
int x_old = 0;
float value = 0;
float value_old = 0;
GtkWidget *button = NULL;
GtkWidget *window = NULL;
GtkWidget *area = NULL;
GtkWidget *table = NULL;
static gboolean load_interface(GtkWidget *widget)
{
cairo_t *cr;
cr = gdk_cairo_create(area->window);
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_rectangle(cr, 0, 0, 900, 400);
cairo_fill(cr);
}
void draw(GtkWidget *widget)
{
cairo_t *cr;
cr = gdk_cairo_create(widget->window);
x_old = x;
x = x + 15;
value_old = value; …Run Code Online (Sandbox Code Playgroud) 使用GTK + 3.6我想从内存中的缓冲区显示图像,而不是磁盘上的文件.我有一个const char *data图像数据,我正在尝试从它创建一个GTK图像.到目前为止,我已经尝试了两种我认为可行的方法.两者都使用GdkPixbuf,因此需要图像数据guchar* (unsigned char*).
有了这个要求,我必须投射数据:
guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
Run Code Online (Sandbox Code Playgroud)
然后我尝试了以下内容:
将数据写入GdkPixbufLoader gdk_pixbuf_loader_write.在这里我得到一个错误"Unrecognized image file format"或者如果我用特定类型(jpg)创建加载器我得到一个错误,说它不是JPG文件格式(它是,如下所述).
编辑:一些代码:
guchar *gudata = reinterpret_cast<guchar*>(const_cast<char*>(data));
int stride = ((1056 * 32 + 31) & ~31)/8;
GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
GError *error = NULL;
if(!gdk_pixbuf_loader_write(loader, gudata, data_size, &error)
{
printf("Error:\n%s\n", error->message);
}
Run Code Online (Sandbox Code Playgroud)
编辑03/01/2013:从写入函数中删除了stride参数 - 错误打印.
开罗表面不起作用.显示黑屏和噪音.
初始化pixbuf gdk_pixbuf_new_from_data然后图像看起来像电视噪声,这表明数据是错误的(并且已经被转换),或者其他参数是错误的(图像行步幅,但它不是:)).
之后的错误我只是想将数据写入到文件中foo.jpg使用ofstream,是的,我得到一个正常的图像文件.file终端中的命令确认它是一个JPEG图像,并且使用一个简单的代码块我从该foo.jpg创建了一个GdkPixbuf来检查它的行步长值,它匹配我传递给上述函数的值.
图像数据是否因演员表而损坏,如果是,我该如何解决?我得到了图像数据const char*.我看过QtPixmap,它也加载了unsigned char*.
我需要使用单独的库吗?(libjpeg?)我安装了libgtk3-dev.
谢谢!
我正在写一个gtk应用程序,它与我的主题不相符.具体来说,应用程序需要适合只有50像素宽的工具栏,并且需要包含进度条,但主题有ProgressBar :: min-horizontal-bar-width = 150(这是默认值).我想告诉代码中的gtk,这个特定的小部件可以忽略该特定的样式属性.
我意识到我可以改变我的系统的主题,但如果我在将来做任何与主题相关的事情,应用程序就会破坏.我更喜欢强大的解决方案.
我也更喜欢保持主题其余部分的解决方案,因此进度条看起来很正常(除了更小).
编辑:这是gtk3
我在 GTK 文本视图中发现了奇怪的异常,希望有人能解释一下。
有一个简单的功能可以滚动到窗口底部:
richTextBox.ScrollToIter(richTextBox.Buffer.EndIter, 0, true, 0, 0);
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,这可能应该有效。但有时它会使用 MemoryAccessViolation(Linux 中的 SIGSEGV)使整个应用程序崩溃
每次我向 TreeView 插入文本时,我的应用程序都会调用此方法,以便我可以始终处于关闭状态(您正在向某个窗口插入文本,并且想要查看最新文本,例如在聊天中)
文本仅从主线程插入,并且此函数也仅在主线程中调用,因此这与我自己的应用程序中的多线程无关,但是我发现 TextView 正在与应用程序的其余部分异步呈现文本。就像负责绘制和处理文本的线程并不是真正的主线程一样。例如,如果我将大文本加载到 TextView 中,即使 TextView 以某种方式加载文本,我的应用程序也会响应。
出于这个原因,我相信 TextView 实际上正在使用自己的单独线程,并且当我尝试滚动窗口时,该线程正在更改文本。正在更改的文本会使 iter 无效,因此在我传递richTextBox.Buffer.EndIter给 TextView ScrollToBottom 函数的 IL 代码之间的某处,该文本可能已被此外部线程更改并且 iter 无效,这就是我收到此内存访问异常的原因。
这甚至可能是 GTK 中的一个错误,但我使用的是非常稳定的版本 (2.1.20),该版本随所有单声道版本一起提供,直到 mono3,甚至适用于所有 Windows gtk# 版本。
有没有其他方法可以“安全”向下滚动
关于我最近遇到过的事情,请快速说明.我使用python,但我想,它也适用于其他语言.
from gi.repository import Gtk
win = Gtk.Window()
listbox = Gtk.ListBox()
somewidget = Gtk.Somewidget()
win.add(listbox)
listbox.insert(somewidget -1)
listbox.remove(somewidget) #ERROR
Run Code Online (Sandbox Code Playgroud)
这是一个GtkListBox,填充了一个非GtkListBoxRow类型的项目.当试图从GtkListBox中删除它时,它给了我以下内容:
Gtk-CRITICAL **: gtk_container_remove: assertion 'gtk_widget_get_parent (widget) == GTK_WIDGET (container) || GTK_IS_ASSISTANT (container) || GTK_IS_ACTION_BAR (container) || GTK_IS_POPOVER_MENU (container)' failed
Run Code Online (Sandbox Code Playgroud) 现在已经花了一些时间来掌握Gnome Builder,Glade,Vala和Genie - 并考虑到优秀的Gnome人机界面指南(GHIG) - 为什么Glade不是几乎所有GTK GUI应用程序的起点?
例如,是否有任何程序将采用Glade(模板)xml文件并自动生成相应的程序化Vala或Genie源代码?如果有标准的Gtk.ApplicationWindow Glade xml文件,例如,随Glade/Gnome附带的GHIG,这些文件可以快速适应特定项目和带有信号自动生成的Genie类模板 - 加上完整的gresource/meson/flatpak结构.这只是直接导入Gnome-Builder作为起点.有这样的事吗?
更新
以下文件application.gs是使用Genie属性组合从application.ui自动生成的.不想在这里重新发明轮子 - 因此这个问题的原因.以下删除了一些字段,但实际文件已完全填写并可以使用.除了'application.ui'的内容之外,唯一需要的信息是资源路径和ui文件名.一切都已包含在Glade文件中.
/*
{PROJECT_SPACE}
'{PROJECT_NAME}' is a command line tool that will parse a glade ui
template and generate a skeleton class in the Genie language
with composite widgets. It will generate GTKTemplate, GTKChild
and GTKCallback entries.
'{PROJECT_NAME}' exists within the {PROJECT_NAMESPACE} namespace.
Copyright (C) 2018 {AUTHOR_NAME} {AUTHOR_EMAIL}
This library is free software; you can redistribute it and or
or modify it …Run Code Online (Sandbox Code Playgroud)