更改颜色并调用后 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
我在 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