更改颜色并调用后 TextCtrl 消失 sizer.Layout

TextCtrl disappears after changing color and calling sizer.Layout

我在 wxPython 中遇到了一个很奇怪的问题,我认为这是一个错误。本质上,我有一个 TextCtrl,当我按下 ctrl 键时它会改变背景颜色(不要问为什么)。然后我有另一个按钮在存储 TextCtrl 的 BoxSizer 上调用 sizer.Layout() 。当我这样做时,TextCtrl 消失(达到零宽度)。仅当 TextCtrl 中有足够的文本且仅当我按下 ctrl+(其他键)时才会发生。这是代码:

import wx


class MyPanel(wx.Panel):


    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.frame = parent


        self.sizer = wx.BoxSizer(wx.VERTICAL)



        self.btn = wx.Button(self, label="TextCtrl disappears?")
        self.btn.Bind(wx.EVT_BUTTON, self.onClick)

        self.txt=wx.TextCtrl(self,value="bunch of text goes here")
        self.txt.Bind(wx.EVT_KEY_DOWN, self.onType)

        self.sizer.Add(self.txt,0,wx.CENTER|wx.ALL,5)
        self.sizer.Add(self.btn,0,wx.CENTER|wx.ALL,5)
        self.SetSizer(self.sizer)
        self.Fit()  


    def onType(self,event):
        if event.GetKeyCode()==308:
            self.txt.SetBackgroundColour((100,255,255,255))
        else:
            event.Skip()



    def onClick(self,event):

        self.sizer.Layout()

class MyFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, parent=None, title="")
        panel = MyPanel(self)

        self.Fit()
        self.Show()


app = wx.App(False)
frame = MyFrame()

app.MainLoop()

现在,尝试转到 TextCtrl 并按下例如 ctrl+a,然后按下按钮。这是一个错误吗?更重要的是,解决方法是什么?我猜想 TextCtrl 更改了它的一个属性,该属性指定了它在 Layout() 下的大小或行为,但我无法弄清楚更改的是哪一个。

编辑:

我正在使用 ubuntu 16.04、Python 2.7.12 和 wxpython 版本 3.0.2.0.

不管是什么,在wxpython 4中已经解决了。
避免问题的方法。

TextCtrl 一个 size=(n,n)

和/或

添加到 sizer 时,将 wx.CENTER 替换为 wx.EXPAND

self.txt=wx.TextCtrl(self,-1,value="bunch of text goes here",size=(50,20))

self.sizer.Add(self.txt,0,wx.EXPAND|wx.ALL,5)

最后,您的键盘肯定有些奇怪,因为使用 EVT_KEY_DOWN 时不应该发生这种情况,而使用 EVT_KEY_UP 时不应该发生。我认为 EVT_KEY_DOWN 通常不会看到 Ctrl 键。参见 https://www.wxpython.org/Phoenix/docs/html/wx.KeyEvent.html