小编oxi*_*rks的帖子

Python Gtk3 - 通过鼠标和课程器位置在 ScrolledWindow 内滚动 TextView

我在 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)

python gtk

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

在Python GTK3中设置Entry Background Color并设置回默认值的最佳方法

为一个条目设置背景颜色并将其设置回默认颜色的最佳方法是什么?

我的脚本现在正在运行,但我确信这不是最好的方法.
我还有两个问题:

  1. 如果我插入一个文本,不包含字符串"red"或"green"并选择此文本,我无法看到我的选择,因为它全是白色的.
  2. 我认为有更好的方式,然后我插入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)

css python gtk3

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

如何从linux bash上的字符串计算crc32校验和

我很久以前用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)

[1] 如何使用Python计算CRC32以匹配在线结果?

bash crc32 checksum

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

如何在GObject.timeout_add - Gtk3中使用Python SecretStorage

我尝试在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,则会出现此问题.

也许它也与这个问题有关: …

python gtk pygobject python-multithreading python-keyring

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

更改Gtk树视图行的背景颜色-Python Gtk Gtk.CellRendererText

可以在创建时设置颜色:

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)

python treeview styles gtk3

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

如何在 Python GTK2 中将 GTK 条目设置为默认活动元素

如何在启动时将 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)

我找不到一个选项:

python gtk2

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