用GTK,python更新标签

时间:2016-11-01 16:36:36

标签: python gtk

我正在学习GTK。感觉就像我在文档中浪费时间。教程非常简短。

我正在尝试制作一个简单的应用程序,可以近乎实时地显示我的CPU的使用情况和温度,但我坚持更新标签。我知道set_label(" text")但我不明白如何以及在何处使用它。 不用说,我是一个完整的菜鸟。

以下是我的示例代码:

header{
font-size: 250%;
background: #beb8a4;
}

header img{
width: 200px;
margin-left: 20px;
margin-top: 10px;
}    `   

获取CPU数据的类

import subprocess
from gi.repository import Gtk
import sys

寡妇构造函数

class CpuData():

    # Get the CPU temperature
    @staticmethod
    def get_temp():
        # Get the output of "acpi -t"
        data = subprocess.check_output(["acpi", "-t"]).split()
        # Return the temperature
        temp = data[15].decode("utf-8")
        return temp


    # Get CPU usage percentage
    @staticmethod
    def get_usage():
        # Get the output of mpstat (% idle)
        data = subprocess.check_output(["mpstat"]).split()
        # Parses the output and calculates the % of use
        temp_usage = 100-float(data[-1])
        # Rounds usage to two decimal points
        rounded_usage = "{0:.2f}".format(temp_usage)
        return rounded_usage

标签类

class MyWindow(Gtk.ApplicationWindow):

    # Construct the window and the contents of the GTK Window
    def __init__(self, app):
        # Construct the window
        Gtk.Window.__init__(self, title="Welcome to GNOME", application=app)
        # Set the default size of the window
        self.set_default_size(200, 100)

应用程序构造函数

class MyLabel(Gtk.Label):
    def __init__(self):
        Gtk.Label.__init__(self)
        temp = CpuData.get_temp()
        # Set the label
        self.set_text(temp)

1 个答案:

答案 0 :(得分:3)

您应该通过超时调用所有方法:

GLib.timeout_add(ms, method, [arg])

GLib.timeout_add_seconds(s, method, [arg])

其中ms是毫秒,s是秒(更新间隔),method是getUsage和getTemp方法。您可以将标签传递为arg

然后你只需要在标签上调用set_text(txt)方法

注意:您需要像这样导入GLib:

from gi.repository import GLib

编辑#1

正如@jku指出的那样,以下方法已经过时,可能只是存在以提供与遗留代码的向后兼容性(所以你不应该使用它们):

GObject.timeout_add(ms,method,  [arg])

GObject.timeout_add_seconds(s,method,  [arg])

编辑#2

由于您的数据方法get_tempget_usage更具通用性,您可以使用一个小的包装函数:

def updateLabels(labels):
    cpuLabel  = labels[0]
    tempLabel = labels[1]
    cpuLabel.set_text(CpuData.get_usage())
    tempLabel.set_text(CpuData.get_usage())
    return False

然后只需:

GLib.timeout_add_seconds(1, updateLabels, [cpuLabel, tempLabel]) # Will update both labels once a second

编辑#3

正如我所说,这是示例代码:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GLib
import time


class TimeLabel(Gtk.Label):
    def __init__(self):
        Gtk.Label.__init__(self, "")
        GLib.timeout_add_seconds(1, self.updateTime)
        self.updateTime()


    def updateTime(self):
        timeStr = self.getTime()
        self.set_text(timeStr)
        return GLib.SOURCE_CONTINUE

    def getTime(self):
        return time.strftime("%c")


window = Gtk.Window()
window.set_border_width(15)
window.connect("destroy", Gtk.main_quit)

window.add(TimeLabel())
window.show_all()
Gtk.main()