我在 Gtk.TextView 中有一些文本
当我用鼠标选择文本或将光标导航到底部边缘之外时,我无法看到我的选择,因为它不滚动。
所以我想我需要获取光标位置并将树视图设置为该位置。单击按钮时的鼠标位置并将树视图移动到该位置。
#!/usr/bin/env python
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class ScrolledWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self)
self.set_default_size(200, 200)
self.connect("destroy", Gtk.main_quit)
self.scrolledwindow = Gtk.ScrolledWindow()
self.add(self.scrolledwindow)
box = Gtk.Box()
self.scrolledwindow.add(box)
textview = Gtk.TextView()
box.pack_start(textview, True, True, 10)
textview.connect("move-cursor", self.move_cursor_event) # arrow keys
textview.connect("key-press-event", self.key_press_event) # keyboard input
textview.connect("button-press-event", self.button_press_event) # mouse click
textbuffer = textview.get_buffer()
text = 50*"Hello World\n"
textbuffer.set_text(text, len(text))
def move_cursor_event(self, tree_view, step, count, extend_selection):
print "move_cursor_event", step, count, extend_selection
def key_press_event(self, widget, …Run Code Online (Sandbox Code Playgroud) 为一个条目设置背景颜色并将其设置回默认颜色的最佳方法是什么?
我的脚本现在正在运行,但我确信这不是最好的方法.
我还有两个问题:
self.entry_default_background_color_strCSS文本的方式.import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
class Window(Gtk.Window):
def __init__(self):
self.screen = Gdk.Screen.get_default()
self.gtk_provider = Gtk.CssProvider()
self.gtk_context = Gtk.StyleContext()
self.gtk_context.add_provider_for_screen(self.screen, self.gtk_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
Gtk.Window.__init__(self, title="Check Input")
self.set_size_request(300, 80)
self.mainbox = Gtk.VBox()
self.add(self.mainbox)
# entry
self.name_entry = Gtk.Entry()
self.name_entry.set_name("name_entry")
self.mainbox.pack_start(self.name_entry, True, True, 0)
self.name_entry.connect("changed", self.check_input)
entry_context = self.name_entry.get_style_context()
self.entry_default_background_color = entry_context.get_background_color(Gtk.StateType.NORMAL)
self.entry_default_background_color_str = self.entry_default_background_color.to_string()
self.show_all()
def check_input(self, _widget=None):
if "red" in self.name_entry.get_text():
self.gtk_provider.load_from_data('#name_entry { background: red; }')
elif "green" …Run Code Online (Sandbox Code Playgroud) 我很久以前用crc32计算了stc的校验栏,但我不记得我是怎么做的.
echo -n "LongString" | crc32 # no output
Run Code Online (Sandbox Code Playgroud)
我找到了一个用Python计算的解决方案[1],但是没有直接的方法来计算字符串吗?
# signed
python -c 'import binascii; print binascii.crc32("LongString")'
python -c 'import zlib; print zlib.crc32("LongString")'
# unsigned
python -c 'import binascii; print binascii.crc32("LongString") % (1<<32)'
python -c 'import zlib; print zlib.crc32("LongString") % (1<<32)'
Run Code Online (Sandbox Code Playgroud)
我尝试在2个Python进程中使用SecretStorage,但是当我尝试更新我的Gtk.Window时,我在大多数时间都收到此消息:
RuntimeError:无法初始化SecretService:未收到回复.可能的原因包括:远程应用程序未发送回复,消息总线安全策略阻止回复,回复超时过期或网络连接中断.
两者都以multiprocessing.Process开始,这是有效的:
def get_data(self):
p1 = Process(target=P1().update_database)
p1.start()
p1.join()
p2 = Process(target=P2().update_database)
p2.start()
p2.join()
Run Code Online (Sandbox Code Playgroud)
问题是:这是阻止我的Gtk界面,窗口被阻止,没有其他按钮可点击.
因此,我使用了一个也是threading.Thread
def on_get_data_button_clicked(self, widget):
thread = Thread(target=self.get_data)
thread.start()
Run Code Online (Sandbox Code Playgroud)
这也有效,但我无法从主窗口看到进程是否仍在进行中.
所以我添加了一个Gtk.Spinner-Button来查看活动
def on_get_data_button_clicked(self, widget):
thread = Thread(target=self.get_data)
thread.start()
GObject.timeout_add(200, self.manage_spinner, thread)
def manage_spinner(self, thread):
if thread.is_alive():
return True
else:
self.sync_spinner.stop()
return False
Run Code Online (Sandbox Code Playgroud)
有时这是有效的,但大多数时候我收到此错误:
RuntimeError:无法初始化SecretService:未收到回复.可能的原因包括:远程应用程序未发送回复,消息总线安全策略阻止回复,回复超时过期或网络连接中断.
在下标中,SecretStorage以这种方式使用:
def get_key(self, key_name):
bus = secretstorage.dbus_init()
collection = secretstorage.get_default_collection(bus)
if collection.is_locked():
collection.unlock()
items = collection.get_all_items()
for item in items:
if item.get_label() == key_name:
return item.get_secret()
Run Code Online (Sandbox Code Playgroud)
如果在get_key()调用期间调用GObject.timeout_add,则会出现此问题.
也许它也与这个问题有关: …
可以在创建时设置颜色:
cell.set_property("background", "orange")
Run Code Online (Sandbox Code Playgroud)
但是,以后如何访问单元小部件?
我要做什么:检查值是否有效,然后将单元格涂成绿色,否则涂成红色。
我发现无法使用CssProvider更改样式。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
import os
from pprint import pprint
class MyTreeviewWindow(Gtk.Window):
def __init__(self):
# css provider
screen = Gdk.Screen.get_default()
gtk_provider = Gtk.CssProvider()
gtk_context = Gtk.StyleContext()
gtk_context.add_provider_for_screen(screen, gtk_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
self.css = """
GtkButton.green{background: green;}
GtkButton.white{background: white;}
GtkCellRenderer{background: blue;}
"""
gtk_provider.load_from_data(bytes(self.css.encode()))
Gtk.Window.__init__(self, title="Overview")
self.set_size_request(600, 400)
self.mainbox = Gtk.VBox()
self.add(self.mainbox)
self.main_sw = Gtk.ScrolledWindow()
self.mainbox.pack_start(self.main_sw, True, True, 0)
button = Gtk.Button("Change Row …Run Code Online (Sandbox Code Playgroud) 如何在启动时将 GTK 条目设置为默认激活元素/小部件,以便我可以在不先单击条目小部件的情况下插入我的文本?
例如,当我启动这个脚本时,我想默认插入到 entry2 中:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
mainbox = gtk.VBox()
window.add(mainbox)
mainbox.pack_start(gtk.Label("Label 1"))
entry1 = gtk.Entry()
mainbox.pack_start(entry1)
mainbox.pack_start(gtk.Label("Label 2"))
entry2 = gtk.Entry()
mainbox.pack_start(entry2)
window.show_all()
gtk.main()
Run Code Online (Sandbox Code Playgroud)
我找不到一个选项: