wxPython文本框暂时出现黑色矩形

1 投票
1 回答
820 浏览
提问于 2025-04-18 10:14

我正在尝试用wxPython写一个程序,这个程序里有一个带标签的笔记本,每个标签里都有用户可以输入数据的文本框。这是一个与物理相关的项目,所以我希望每个文本框后面都有一个“单位”标签,显示应该输入什么单位。问题是:当程序运行时,我在每个文本框的左上角会看到一个黑色的矩形,大小和单位标签一样。这个黑色框在以下任何操作后会立刻消失:

  • 按下Tab键进入文本框
  • 将光标移动到文本框上
  • 在笔记本中切换标签
  • 调整窗口大小,直到文本框也跟着缩小。

功能上来说,一切都正常,我只是想在启动时去掉这些黑色矩形。

这是我的代码:

#! usr/bin/python

import wx

class MainWindow(wx.Frame):
    def __init__(self, title):
        wx.Frame.__init__(self, None, title=title, size=(400,300))
        self.make_gui()
        self.Show()

    def make_gui(self):
        self.panel=wx.Panel(self,wx.ID_ANY)
        sizer=wx.BoxSizer(wx.VERTICAL)
        ins=self.gui_inputs()
        sizer.Add(ins)
        self.panel.SetSizer(sizer)

    def gui_inputs(self):
        sizer=wx.BoxSizer(wx.HORIZONTAL)
        simpleinputs=(("Page 1",(("Name",None),("Item","in"))),("sec page",tuple()))
        simple=self.gui_inputs_make_simple(simpleinputs)
        sizer.Add(simple)
        return sizer

    def gui_inputs_make_simple(self,simpleinputs):
        sizer=wx.BoxSizer(wx.VERTICAL)
        notebook=wx.Notebook(self.panel)
        for tab in simpleinputs:
            pan=wx.Panel(notebook,wx.ID_ANY)
            siz=wx.BoxSizer(wx.VERTICAL)
            for item in tab[1]:
                it=self.gui_inputs_make_labeled_unitinput(pan,item[0],item[1])
                siz.Add(it)
            pan.SetSizer(siz)
            notebook.AddPage(pan,tab[0])
        sizer.Add(notebook)
        return sizer

    def gui_inputs_make_labeled_unitinput(self,par,label='',units='',validatenumber=False):
        sizer=wx.BoxSizer(wx.HORIZONTAL)
        lbl=wx.StaticText(par,label=label+':')
        sizer.Add(lbl)
        edit=wx.TextCtrl(par)
        sizer.Add(edit)
        if units!=None:
            unit=wx.StaticText(par,label=units)
            sizer.Add(unit)
        return sizer

app = wx.App(False)
frame = MainWindow("GUI")
app.MainLoop()

这是我得到的截图:

enter image description here

以下是我能让黑色矩形消失的方法(但没有一个能让我完成我需要做的事情):

当我去掉放单位的代码时,它就正常了。当我去掉单位字段里的文本时,它也正常。当我只有一个标签时,它也正常。

如果有人能告诉我为什么会这样,我将非常感激。

提前谢谢大家!

1 个回答

1

这个问题挺有意思的:

TextCtrl实例中,黑色框框会在你正确设置好布局管理器后消失。你可以通过更新主sizer的布局来做到这一点,方法是:

sizer.Layout()

或者

sizer.Fit(self)

在你的make_gui方法的最后。

这个方法对我有效,但当然并没有解释为什么TextCtrl一开始会保持黑色。

撰写回答