微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 wxPython

如何解决在 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。