проблема с получением содержимого wx.TextCtrl для повторного центрирования при изменении размера

У меня есть TextCtrl со стилем = wx.TE_CENTRE, и я хочу/ожидаю, что его содержимое останется в центре при изменении размера TextCtrl. Однако текст остается слева от TextCtrl.

import wx

class MyApp(wx.App):
    def OnInit(self):
        frame = wx.Frame(None)
        frame.Show(True)
        self.SetTopWindow(frame)
        self.myText = wx.TextCtrl(frame, value="A", style=wx.TE_CENTRE)

        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.myText, wx.EXPAND)

        frame.SetSizer(sizer)
        sizer.Fit(frame)

        self.Bind(wx.EVT_SIZE, self.OnSize)
        return True

    def OnSize(self, evt):
        self.myText.SetValue("after resize")

myApp = MyApp(0)
myApp.MainLoop()

После долгих проб и ошибок я заработал, выполнив оба из следующих действий:

  • Обновите TextCtrl в моем обработчике wx.EVT_SIZE
  • Добавьте стиль wx.TE_RICH в TextCtrl.

Почему они оба необходимы? Я хотел бы понять, что я делаю неправильно здесь. (Я использую wxPython 4.0.4 на Win7.)


person TheFrankster    schedule 26.04.2019    source источник


Ответы (1)


Это может быть ваша среда, она определенно нормально работает в Linux с использованием wx 4.0.4
Это может быть связано с тем, что вы делаете все это в классе wx.App.
Обычно этот код должен быть написан примерно так: :

import wx

class MyFrame(wx.Frame):
    def __init__(self,parent):
        wx.Frame.__init__(self,parent,-1,("My Frame"), size=(200,100))
        self.myText = wx.TextCtrl(self, value="A", style=wx.TE_CENTRE)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(self.myText, wx.EXPAND)
        self.SetSizer(sizer)
        self.Show()

myApp = wx.App()
frame = MyFrame(None)
myApp.MainLoop()

Этот код ведет себя так же неправильно?

person Rolf of Saxony    schedule 29.04.2019
comment
Ваш код действительно работает на Win7. Однако, если я добавлю обработчик wx.EVT_SIZE, он сломается. То есть, если я не добавлю evt.Skip() в обработчик. Впоследствии я обнаружил, что мой исходный код действительно работает, если я добавлю evt.Skip() к моему обработчику wx.EVT_SIZE(!). Спасибо за Ваш ответ; это подтолкнуло меня в правильном направлении. - person TheFrankster; 29.04.2019