如何使用 python 在没有按键事件的情况下在内部更新/重绘 GTK Widget (GTKLabel)?

2024-04-02

我下面有一些代码试图更新 GTK 标签元素。我包括两个文件:ui 文件和 py 文件。

UI file:

<glade-interface>
  <widget class="GtkWindow" id="ApplicationFrame">
    <property name="width_request">320</property>
    <property name="height_request">240</property>
    <property name="visible">True</property>
    <property name="events">GDK_KEY_PRESS_MASK</property>
    <property name="title" translatable="yes">Simple</property>
    <property name="resizable">False</property>
    <property name="window_position">center-always</property>
    <property name="default_width">320</property>
    <property name="default_height">240</property>
    <property name="decorated">False</property>
    <property name="gravity">center</property>
    <child>
      <widget class="GtkFixed" id="layout">
        <property name="width_request">320</property>
        <property name="height_request">240</property>
        <property name="visible">True</property>
        <child>
          <widget class="GtkLabel" id="l1">
            <property name="width_request">320</property>
            <property name="height_request">40</property>
            <property name="visible">True</property>
            <property name="xalign">0</property>
            <property name="label" translatable="yes">l1</property>
          </widget>
          <packing>
            <property name="y">43</property>
          </packing>
        </child>
      </widget>
    </child>
  </widget>
</glade-interface>

Python文件

import os
from time import sleep as wait
import gtk as gtk
import gtk.glade as glade
import gobject

class Application(object):
    def __init__ (self):
        self.glade = glade.XML("simple.ui")
        self.setup_ui()

    def setup_ui (self):
        self.window = self.glade.get_widget("ApplicationFrame")
        self.l1 = self.glade.get_widget("l1")
        self.names = {'l1' : self.l1}
        self.all = [self.l1]
        gobject.timeout_add(1000,self.display_me)
        gobject.timeout_add(100,self.do_something_that_takes_a_while)
        self.window.add_events(gtk.gdk.KEY_PRESS_MASK)
        self.window.connect("key-press-event", self.handler)
        self.window.connect("delete_event", self.delete_event)
        self.window.connect("destroy", self.destroy)
        self.window.show()

    def get_signal (self,widget,event):
        keyname = gtk.gdk.keyval_name(event.keyval)
        ctrl = event.state & gtk.gdk.CONTROL_MASK
        alt = event.state & gtk.gdk.MOD1_MASK
        shift = event.state & gtk.gdk.SHIFT_MASK
        name = []
        if ctrl and keyname not in ["Control_L","Control_R"]: 
            name.append("CTRL")
        if alt and keyname not in ["Alt_L","Alt_R"]:
            name.append("ALT")
        if shift and keyname not in ["Shift_L","Shift_R"]:
            name.append("SHIFT")
        name.append(keyname)
        name = "+".join(name)
        return name

    def handler (self,widget,event):
        name = self.get_signal(widget,event)
        if name.lower() in ['ctrl+x','ctrl+c','alt+q']:
            self.destroy()

    def main(self):
        gtk.main()

    def delete_event (self,widget=None,event=None,data=None):
        return False

    def destroy (self,widget=None,data=None):
        gtk.main_quit()

    def get (self,item):
        if isinstance(item, str): 
            if item in self.names:
                item = self.names[item]
        retval = None
        if hasattr(item,"text"):
            retval = item.text()
        elif hasattr(item,"get_label"):
            retval = item.get_label()
        return retval

    def set (self,item,text='',font=None):
        print 'Setting...'
        if isinstance(item, str): 
            if item in self.names:
                item = self.names[item]
        retval = None
        if font == None and hasattr(self,"page") and hasattr(self.page,"NORMAL_FONT"): 
                font = self.page.NORMAL_FONT
        if hasattr(item,"setText"):
            retval = item.setText(text)
        elif font == None:
            if hasattr(item,'set_text'):
                retval = item.set_text(text)
        elif hasattr(item,"set_label"):
            retval = item.set_label(text)
            if hasattr(item,"modify_font") and font != None:
                item.modify_font(font)
        item.queue_draw()
        self.try_to_update(item)
        print 'done'
        return retval

    def try_to_update (self,item):
        """
        do something here to update the visual screen????
        """
        print str(self)

    def do_something_that_takes_a_while (self):
        timeout = 15
        while timeout != 0:
            self.set('l1','%s' % timeout)
            wait(1)
            timeout -= 1
            print timeout
        return 1

    def clean (self):
        if item != None:
            self.set(item,empty_text)
        else:
            if hasattr(self,'all'):
                for item in self.all:
                    self.set(item)

    def display_me (self):
        print str(self)
        return True

    def __str__ (self):
        space = 25
        value = '%'+str(space)+'s'
        lines = ['\n','-'*79]
        if hasattr(self,'all'):
            line = []
            for obj in self.all:
                obj_value = self.get(obj)
                line.append(value % obj_value if obj_value != None else '')
                #line.append(value % ' ')
            lines.append(''.join(line))
        lines.append('-'*79)
        return '\n'.join(lines)


if __name__ == "__main__":
    from time import sleep as wait
    SEC = 1
    app = Application()
    app.main()

这应该很简单,但我完全不知道我做错了什么。元素 l1 未正确更新。我认为 try_to_update 中的代码是我需要更新 UI 的地方,但我不知道需要调用哪个函数。有人可以帮忙吗?

提前致谢!


您将需要使用小部件queue_draw http://www.pygtk.org/docs/pygtk/class-gtkwidget.html#method-gtkwidget--queue-draw功能:

queue_draw_area() 方法通过调用以下方法使小部件的矩形区域无效 (...)gtk.gdk.Window.invalidate_rect()小部件的窗口及其所有子窗口上的方法。

但是,正如您已经在您的set方法,我的猜测是

if hasattr(item,'show')

检查会阻止该项目更新。另一项检查是致电queue_draw在整个窗口上运行函数,看看是否会更新内容。

或者,强制按如下方式处理排队的事件:

while gtk.events_pending():
    gtk.main_iteration_do(True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 python 在没有按键事件的情况下在内部更新/重绘 GTK Widget (GTKLabel)? 的相关文章

  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 将html数据解析成python列表进行操作

    我正在尝试读取 html 网站并提取其数据 例如 我想查看公司过去 5 年的 EPS 每股收益 基本上 我可以读入它 并且可以使用 BeautifulSoup 或 html2text 创建一个巨大的文本块 然后我想搜索该文件 我一直在使用
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 在Python中检索PostgreSQL数据库的新记录

    在数据库表中 第二列和第三列有数字 将会不断添加新行 每次 每当数据库表中添加新行时 python 都需要不断检查它们 当 sql 表中收到的新行数低于 105 时 python 应打印一条通知消息 警告 数量已降至 105 以下 另一方面
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • Numpy - 根据表示一维的坐标向量的条件替换数组中的值

    我有一个data多维数组 最后一个是距离 另一方面 我有距离向量r 例如 Data np ones 20 30 100 r np linspace 10 50 100 最后 我还有一个临界距离值列表 称为r0 使得 r0 shape Dat
  • 加快网络抓取速度

    我正在使用一个非常简单的网络抓取工具抓取 23770 个网页scrapy 我对 scrapy 甚至 python 都很陌生 但设法编写了一个可以完成这项工作的蜘蛛 然而 它确实很慢 爬行 23770 个页面大约需要 28 小时 我看过scr
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • pip 列出活动 virtualenv 中的全局包

    将 pip 从 1 4 x 升级到 1 5 后pip freeze输出我的全局安装 系统 软件包的列表 而不是我的 virtualenv 中安装的软件包的列表 我尝试再次降级到 1 4 但这并不能解决我的问题 这有点类似于这个问题 http
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 如何应用一个函数 n 次? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 假设我有一个函数 它接受一个参数并返回相同类型的结果 def increment x return x 1 如何制作高阶函数repeat可以
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐