初始化时如何给Gtk 3 Scale添加标记?

问题描述 投票:0回答:0

我是用 Python 构建图形应用程序的新手。我首先按照 https://python-gtk-3-tutorial.readthedocs.io/en/latest/

上的教程开始

我的预期应用程序将广泛使用滑块 (Gtk.Scale)。为了给它们一个统一的外观,我定义了一个继承 Gtk.Scale 的类 MyMeter。

每个滑块都应该有标记。为了举例,让我们使用“X”。这是预期外观的屏幕截图:

我使用以下 MWE 完成了正确的外观:

#! /usr/bin/env python3

import sys
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gio, Gtk, Gdk

class MyMeter(Gtk.Scale):
    def __new__(cls, maximum, minimum = 0):
        return Gtk.Scale.new_with_range(
            Gtk.Orientation.HORIZONTAL,
            minimum, maximum, 1
        )
    def __init__(self, maximum, minimum = 0, current = 0):
        super().__init__()
        self.minimum = minimum
        self.maximum = maximum
        self.value = current

class AppWindow(Gtk.ApplicationWindow):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        box = Gtk.Box()
        self.add(box)
        maximum = 5
        self.meter = MyMeter(maximum)
        for n in range(maximum + 1):
            self.meter.add_mark(n, 0, "X")
        box.pack_start(self.meter, True, True, 0)
        self.show_all()

class Application(Gtk.Application):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.window = None

    def do_startup(self):
        Gtk.Application.do_startup(self)

    def do_activate(self):
        if not self.window:
            self.window = AppWindow(application = self, title = "Example")
        self.window.present()

if __name__ == "__main__":
    app = Application()
    app.run(sys.argv)

但是,请注意

add_mark
在初始化后在
meter
实例上调用。我想这样做:

class MyMeter(Gtk.Scale):
    def __new__(cls, maximum, minimum = 0):
        return Gtk.Scale.new_with_range(
            Gtk.Orientation.HORIZONTAL,
            minimum, maximum, 1
        )
    def __init__(self, maximum, minimum = 0, current = 0):
        super().__init__()
        self.minimum = minimum
        self.maximum = maximum
        self.value = current
        for n in range(self.maximum + 1):
            self.add_mark(n, 0, "X")

注意

add_mark
代码现在是如何在
MyMeter
的初始化程序中的。然而,它产生了以下屏幕截图,我们看到标记没有出现:

为什么我把

add_mark
放入初始化程序时标记没有出现?

如何初始化 MyMeter,使类的每个实例都显示预期的标记?

python inheritance initialization gtk3
© www.soinside.com 2019 - 2024. All rights reserved.