【问题标题】:Group a StaticText with a TextCtrl in wxPython在 wxPython 中使用 TextCtrl 对 StaticText 进行分组
【发布时间】:2021-09-14 19:05:38
【问题描述】:

我想构建一个 UI 来编辑 mp3 文件的 ID3v2 标签。我需要一个 StaticText - TextCtrl 列表来编辑不同的标签。我不想单独创建 StaticText 和 TextCtrl,而是想编写一个将它们结合起来的小部件。 我希望它看起来像这样:

我的第一个想法是扩展 BoxSizer 并使用 StaticText 和 TextCtrl 预填充它

import wx

class LabelTextSizer(wx.BoxSizer):
    def __init__(self, label):
        super().__init__(wx.HORIZONTAL)

        self.label = wx.StaticText(self, label=label)
        self.text = wx.TextCtrl(self)

        self.Add(self.label)
        self.Add(self.text)

但它并没有像我期望的那样工作:

Traceback (most recent call last):
  File "D:\Tron\repo\rex-song-tagger\main.py", line 58, in <module>
    frm = HelloFrame(None, title='Hello World 2')
  File "D:\Tron\repo\rex-song-tagger\main.py", line 25, in __init__
    sizer = LabelTextSizer('Title')
  File "D:\Tron\repo\rex-song-tagger\LabelTextSizer.py", line 25, in __init__
    self.label = wx.StaticText(self, label=label)
TypeError: StaticText(): arguments did not match any overloaded call:
  overload 1: too many arguments
  overload 2: argument 1 has unexpected type 'LabelTextSizer'

Process finished with exit code 1

你会如何以 wx 方式做到这一点?

【问题讨论】:

  • 你想要一个小部件而不是一个sizer。 wx.ListBox 可能是竞争者。

标签: python user-interface wxpython python-3.9


【解决方案1】:

您已将 LabelTextSizer(大小调整器)用作 StaticText 和 TextCtrl 小部件的父级,但这必须是 wx.window(例如您的框架或面板),see wxPython docs

这行得通:

import wx


class MainFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(None, *args, **kwargs)

        self.panel = MainPanel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.panel)
        self.SetSizer(sizer)
        self.Show()


class MainPanel(wx.Panel):
    def __init__(self, parent, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)
        labeltext_1 = LabelTextSizer(self, 'Title', size=(300, -1), style=wx.TE_PROCESS_TAB)
        labeltext_2 = LabelTextSizer(self, 'Artist', size=(300, -1), style=wx.TE_PROCESS_TAB)
        labeltext_3 = LabelTextSizer(self, 'Track', size=(300, -1), style=wx.TE_PROCESS_TAB)
        labeltext_1.text.SetHint("TIT2 ...")
        labeltext_2.text.SetHint("TPE2 ...")
        labeltext_3.text.SetHint("TRCK ...")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(labeltext_1, 0, wx.ALL, 10)
        sizer.Add(labeltext_2, 0, wx.ALL, 10)
        sizer.Add(labeltext_3, 0, wx.ALL, 10)
        self.SetSizer(sizer)


class LabelTextSizer(wx.BoxSizer):
    def __init__(self, parent, label, size=wx.DefaultSize, style=0):
        super().__init__(wx.VERTICAL)

        self.label = wx.StaticText(parent, label=label)
        self.text = wx.TextCtrl(parent, size=size)

        self.Add(self.label)
        self.Add(self.text)

if __name__ == '__main__':
        wx_app = wx.App()
        MainFrame()
        wx_app.MainLoop()

【讨论】:

  • 希望你不要介意,我稍微调整了代码。如果有问题请告诉我,我会将代码还原为您的原始代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2011-07-09
  • 2011-07-12
  • 2014-05-11
  • 1970-01-01
  • 2011-03-21
相关资源
最近更新 更多