wxPython textctrl временно получает черный прямоугольник

#python #python-2.7 #wxpython #wxtextctrl

#python #python-2.7 #wxpython #wxtextctrl

Вопрос:

Итак, я пытаюсь написать программу с использованием wxPython, в которой будет записная книжка с вкладками, каждая из которых позволяет пользователю вводить некоторые данные в текстовые поля. Это для проекта, связанного с физикой, поэтому я хочу, чтобы в каждом текстовом поле после него была метка «единицы измерения», отображающая, в каких единицах оно должно быть введено. Проблема в том, что при запуске программы я получаю черный прямоугольник в верхнем левом углу каждого textctrl, который соответствует размеру метки, в которой находятся единицы. Черный ящик исчезает навсегда сразу после любого из следующих действий:

  • нажмите tab на textctrl
  • переместите курсор на textctrl
  • переключение вкладок в записной книжке
  • изменяйте размер окна до тех пор, пока textctrl не будет уменьшен вместе с ним.

функционально все работает нормально, я просто хочу избавиться от черных прямоугольников при запуске.

Это мой код:

 #! 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()
  

и это скриншот того, что я получаю:

введите описание изображения здесь

Ниже приведены способы, с помощью которых я смог заставить черные прямоугольники исчезнуть (но ни один из них не позволил мне делать то, что мне нужно):

Когда я удаляю код для вставки блоков, он работает. Когда я удаляю текст из полей единиц измерения, это работает. Когда у меня есть только одна вкладка, это работает.

Если кто-нибудь может сказать мне, почему это происходит, я был бы очень признателен.

Заранее спасибо!

Ответ №1:

Это было интересно:

Черные ящики в TextCtrl экземплярах исчезают, как только каскады калибровки настроены правильно. Вы можете сделать это, обновив макет вашего основного sizer с помощью:

 sizer.Layout()
  

или

 sizer.Fit(self)
  

в конце вашего make_gui метода.

Это работает для меня, но, конечно, не объясняет, почему TextCtrl остается черным в первую очередь без.

Комментарии:

1. Спасибо! Это сработало отлично! Я ценю ваш быстрый ответ. Что касается того, почему это так, для меня это не так важно. Кроме того, я решил вместо этого использовать «SetSizerAndFit», потому что он сохраняет размер окна, но я бы никогда не подумал попробовать это без вашего ответа.