我试图将我的应用程序从linux移植到Windows,我有一个主题问题.在Linux中,这是一个盒子,只需编译它,应用程序使用良好的主题,看起来像本机.
我在MSYS2中安装了gtkmm3和gtk3,我正在用CMake构建它.这没关系,我不得不将所有dll复制到二进制目录以便能够执行它.我没有复制任何其他内容.我正在尝试创建"解压缩和执行"包.
我的问题是,该应用程序看起来不合适.它看起来并不原生.窗口周围有阴影,这在Windows10中很好,但在Windows 7中它看起来不是原生的.还缺少几个图标.
甚至gitk3-demo也以相同的方式看起来非原生(但它至少有最小化/最大化/关闭图标正确).
所以问题是:如何在Windows上实现GTK3应用程序的原生外观?或者至少是原生的窗户装饰品?
谢谢
我正在尝试使用Python,GTK3和cairo创建一个简单的绘图应用程序.该工具应该有不同的刷子和某种高亮笔.我想我可以使用笔划的alpha属性来创建它.但是,连接点会重叠创建,从而产生奇怪的效果.
以下是负责此红色画笔和荧光笔模式的代码:
def draw_brush(widget, x, y, odata, width=2.5, r=1, g=0, b=0, alpha=1):
cr = cairo.Context(widget.surface)
cr.set_source_rgba(r, g, b, alpha)
cr.set_line_width(width)
cr.set_line_cap(1)
cr.set_line_join(0)
for stroke in odata:
for i, point in enumerate(stroke):
if len(stroke) == 1:
radius = 2
cr.arc(point['x'], point['y'], radius, 0, 2.0 * math.pi)
cr.fill()
cr.stroke()
elif i != 0:
cr.move_to(stroke[i - 1]['x'], stroke[i - 1]['y'])
cr.line_to(point['x'], point['y'])
cr.stroke()
cr.save()
Run Code Online (Sandbox Code Playgroud)
借助鼠标点击的代码:
def motion_notify_event_cb(self, widget, event):
point = {'x': event.x, 'y': event.y, 'time': time.time()}
if self.odata:
self.odata[-1].append(point)
if …
Run Code Online (Sandbox Code Playgroud) 我正在使用迁移指南(将GTK2移植到GTK3)将脚本转换为使用Gtk3 .我把我改成import pygtk
了from gi.repository import Gtk
等等......
我被困了,因为glade模块是从模块gtk加载的:
import gtk
import gtk.glade
Run Code Online (Sandbox Code Playgroud)
但是现在再也没办法了.
请注意,我只需要替换gtk.glade.XML()
...
我正在使用GTK 构建一个相当简单的C应用程序,但必须执行一些阻止IO,这将触发GUI的更新.为了做到这一点,我在此pthread
之前开始一个新的权利gtk_main()
:
/* global variables */
GMainContext *mainc;
/* local variables */
FILE *fifo;
pthread_t reader;
/* main() */
mainc = g_main_context_default();
pthread_create(&reader, NULL, watch_fifo, argv[argc-1]);
gtk_main();
Run Code Online (Sandbox Code Playgroud)
当pthread
读取一些数据时,它会更新GUI,如下所示:
g_main_context_invoke(mainc, set_icon, param);
Run Code Online (Sandbox Code Playgroud)
哪里set_icon
是
gboolean set_icon(gpointer data)
{
char *p = (char*)data;
gtk_status_icon_set_from_icon_name(icon, p);
return FALSE;
}
Run Code Online (Sandbox Code Playgroud)
这一切都在大部分时间都有效,但我不时地得到这个奇怪的错误信息:
[xcb] Unknown sequence number while processing queue [xcb] Most likely this is a multi-threaded client and XInitThreads has not been called [xcb] Aborting, sorry …
我正在尝试gtk3中的CSS,我不明白如何使用特定的类.
C代码:
provider = gtk_css_provider_new();
display = gdk_display_get_default();
screen = gdk_display_get_default_screen (display);
gtk_style_context_add_provider_for_screen (screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
gtk_css_provider_load_from_path(GTK_CSS_PROVIDER(provider),"styles.css",NULL);
enter_button = gtk_button_new_with_label("Print");
g_signal_connect(G_OBJECT(enter_button), "clicked", G_CALLBACK(print_entry_dialog),&t_data);
gtk_box_pack_start(GTK_BOX(hbox3), enter_button, TRUE, TRUE, 0);
Run Code Online (Sandbox Code Playgroud)
Css(styles.css):
GtkButton{
background: #669999;
text-shadow: 1px 1px 5px black;
box-shadow: 0px 0px 5px black;
border: 1px solid black;
}
Run Code Online (Sandbox Code Playgroud)
但我想设置一个'enter_button'类,它只为'enter_button'设置属性,而不是为GtkButton名下的所有小部件设置属性.
我读到了gtk_style_context_add_class()func,但我不知道它如何与'styles.css'文件一起使用.我该做什么?
我在流程盒中有一组标签,问题是我希望这些标签最多可以达到96px.我已经设置了label.set_ellipsize(True),但由于flowbox为他们提供了尽可能多的空间,所以即使我已将其大小请求设置为96px宽,也不会进行椭圆化处理.
我已经尝试了我能找到的所有功能,这些功能似乎与所涉及的所有小部件相关,但似乎没有任何效果.
我找到的唯一解决方法是使用set_min_children_per_line(),但这需要计算流量宽度中的子节点数,这取决于每行子节点的数量,从而导致流量变得非常快.
我可能错过了一些显而易见的事情,但我已经在这几天抨击这个问题了.
我已经制作了这个测试用例,当列数不能被2整除时,它会出现问题:
from gi.repository import Gtk as gtk
from gi.repository import Pango as pango
class Widget(gtk.VBox):
def __init__(self,label):
gtk.VBox.__init__(self)
image=gtk.Image.new_from_icon_name("image-missing",gtk.IconSize.DIALOG)
image.set_size_request(96,96)
self.add(image)
lbl=gtk.Label(label)
self.add(lbl)
class TestCase(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
lbl=gtk.Label("some text")
scrollbox=gtk.ScrolledWindow()
self.add(scrollbox)
flowbox=gtk.FlowBox()
scrollbox.add(flowbox)
for i in range(50):
w=Widget("longlabel"*5)
flowbox.add(w)
w=Widget("short")
flowbox.add(w)
if __name__=="__main__":
w=TestCase()
w.connect("delete-event",gtk.main_quit)
w.show_all()
gtk.main()
Run Code Online (Sandbox Code Playgroud) 在哪里可以找到用户可以在GTK + 3的CSS文件中定义的可用键绑定的详尽列表?
我已经检查了这些资源:
例如,用户如何<Control>Space
将光标移动到文本末尾GtkTextView
?
如何GtkComboBoxText
使用"静态"方面和"动态"方面自定义a的完成?静态方面是因为某些条目是已知的并且在构造时添加到组合框文本中gtk_combo_box_text_append_text
.动态方面,因为我还需要完成将向您介绍一些回调函数(S),即完成动态的的-after创建GtkComboBoxText
小窗口一次几个大字已经被输入.
我的应用程序使用Boehm的GC(当然除了GTK对象),如Guile或SCM或Bigloo正在做的.它可以看作是一个实验性的持久动态类型编程语言实现,带有编译的集成编辑器和用于Debian/Linux/x86-64的系统GTK3.21库,它在C99中编码(其中一些是生成的)和是用GCC6编译的.
(我不关心非Linux系统,GTK3库比GTK3.20旧,GCC编译器比GCC6旧)
我正在输入(输入GtkComboBoxText
)名称或对象ID.
该名称与C-identifier类似,但以字母开头,不能以下划线结尾.例如comment
,if
,the_GUI
,the_system
,payload_json
,或者x1
是有效的名称(但还是_a0bcd
无效的名字,因为他们开始或下划线结束).我目前有十几个名字,但我可以有几千个.因此,这将是合理的报价完成一次只有一个或者是两个字母已经输入,并完成了,因为他们不是很多人的名字可以静态地发生(所以我觉得合理调用foobar_
gtk_combo_box_append_text
每个名称).
的对象的ID以下划线后跟数字开始,并具有正好18个字母数字(排序的随机的)字符.例如,_5Hf0fFKvRVa71ZPM0
,_8261sbF1f9ohzu2Iu
,_0BV96V94PJIn9si1K
是可能的对象的id.实际上它是96个几乎随机的位(可能只有2 94个可能).object-id扮演UUID的角色(在某种意义上,假设它对于不同的对象是全世界唯一的)但具有C友好语法.我目前有几十个物体,但我可能有几十万(或者一百万).但考虑到四个大字像一个前缀_6S3
或者_22z
,我假设只有一个合理的数字(可能顶多十几好,而且肯定不超过一千)对象ID在我与前缀应用存在.当然,这是不合理的登记(静态)先验的所有对象ID(完成具有四个大字已经被输入后发生的,应该动态地发生).
所以我希望完成一个适用于名称的完成(例如,键入一个字母或许后面跟另一个字母字符应该足以提出最多一百个选项的完成),以及对象-id(键入四个字符_826
就足够了触发完成可能最多几十个选择,如果运气不好可能是一千个).
因此键入三个按键p a tab将提供完成与像几个名字payload_json
或payload_vectval
等等,然后键入五个按键_ 5 H f tab …
我正在我的项目中使用Gtk TextView/TextBuffer,用户可以通过选择正确的切换按钮来输入富文本(粗体/斜体/下划线).
问题是,如果我将下划线或斜体Pango标志应用于TextView中的文本,然后关闭斜体/下划线并输入更多,然后通过TextBuffer.serialize()
未格式化的文本(在TextView中明显未格式化)获取带有这些标记的文本返回时带有下划线/斜体标签.
你可以在这里看到:(注意,为了便于阅读,我使用BeautifulSoup将标签简化为HTML副本,但实际的位置/类型根本没有被编辑过.)
这是代码(需要安装Python3的Gtk3和BS4):
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, Pango
import smtplib, mimetypes
from bs4 import BeautifulSoup
class Handler():
def __init__(self):
global html
self.state = 0
def onDeleteWindow(self, *args):
Gtk.main_quit(*args)
def onSendClicked(self, button):
start, end = textBodyBuffer.get_bounds()
self.content = textBodyBuffer.get_text(start, end, True)
# Below is the serialization code for exporting with format tags
format = textBodyBuffer.register_serialize_tagset()
exported = textBodyBuffer.serialize(textBodyBuffer, format, start, end)
exported = exported.decode("latin-1")
exported = exported.split('<text_view_markup>', 1)
del exported[0]
exported[0] = …
Run Code Online (Sandbox Code Playgroud)