我是用 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,使类的每个实例都显示预期的标记?