在 wxPython

问题描述

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

enter image description here

我的第一个想法是扩展一个 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",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-way?

解决方法

您已使用 LabelTextSizer(一个 sizer)作为 StaticText 和 TextCtrl 小部件的父级,但这必须是 wx.window(例如您的框架或面板),see wxPython docs

这有效:

import wx


class MainFrame(wx.Frame):
    def __init__(self,*args,**kwargs):
        super().__init__(None,**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,**kwargs):
        super().__init__(parent,**kwargs)
        labeltext_1 = LabelTextSizer(self,'Title',size=(300,-1),style=wx.TE_PROCESS_TAB)
        labeltext_2 = LabelTextSizer(self,'Artist',style=wx.TE_PROCESS_TAB)
        labeltext_3 = LabelTextSizer(self,'Track',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,wx.ALL,10)
        sizer.Add(labeltext_2,10)
        sizer.Add(labeltext_3,10)
        self.SetSizer(sizer)


class LabelTextSizer(wx.BoxSizer):
    def __init__(self,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()

enter image description here