wxPython多行文本框在wx.Frame中过大 - 如何自动“缩小”到文本框的正确大小?
我不太确定我是不是在正确地提问(比如说在正确的上下文中使用小部件/对象)。这段代码只是个实验(我现在正在学习类和wxPython)——所以它可能并不是一个功能完整的代码。
问题是:我有一个窗口/框架,允许用户指定宽度和高度,里面有一个多行文本框。最开始,我把多行文本框的大小设置成和父框架一样大,但因为文本框的滚动条比框架/文本框的大小要大,所以滚动条被隐藏了。因此,我决定手动调整文本框的大小,以确保文本框的大小考虑到滚动条的空间(请看下面的代码,特别是“sizexTxt = sizex - 17”和“sizeyTxt = sizey - 44”这两行)。
问题是:有没有什么方法可以调整文本框,而不是一个像素一个像素地手动调整?有没有人能提供一些被认为是“pythonic”的建议?
import wx
class myFrame(wx.Frame):
def __init__(self, parent, title, sizexy, sizexyTxt):
wx.Frame.__init__(self, parent, title=title, size=sizexy)
self.Show(True)
wx.TextCtrl(self, style=wx.TE_MULTILINE, size=(sizexyTxt))
pass
sizex = input("X= ")
sizey = input("Y= ")
sizexy=(sizex, sizey)
sizexTxt = sizex - 17
sizeyTxt = sizey - 44
sizexyTxt = (sizexTxt, sizeyTxt)
myApp = wx.App(False)
frameNow = myFrame(None,"This is my title", sizexy, sizexyTxt)
myApp.MainLoop()
2 个回答
1
你需要使用一个布局管理器(或者多个布局管理器),然后在添加组件的时候指定 wx.EXPAND,这样可以让它在水平方向上填满布局管理器;而 wx.ALL 则是让它在垂直方向上也填满。
你可以在这里查看布局管理器的文档:http://wiki.wxpython.org/Getting%20Started#Sizers
其实你可能还想看看整个“与窗口交互”这一部分,里面的信息非常有用。
2
Jake给了你一个正确的方向,但还有一件事你需要知道。第一个放进窗口的对象会被包裹在一个基本的布局管理器里。问题是,按照我所知道的,你无法控制这个布局管理器。所以你需要添加自己的布局管理器,这样你就可以用它来调整窗口的大小。你需要对这个布局管理器有控制权,因为你希望窗口的大小能够根据布局管理器的设置来变化。
import wx
class myFrame(wx.Frame):
def __init__(self, size, *arg, **kwarg):
wx.Frame.__init__(self, *arg, **kwarg)
self.text = wx.TextCtrl(self, style=wx.TE_MULTILINE, size=size)
self.sizer = wx.BoxSizer()
self.sizer.Add(self.text, proportion=1, flag=wx.EXPAND)
self.SetSizerAndFit(self.sizer)
self.Show()
myApp = wx.App(False)
size = []
for a in ["X", "Y"]:
d = wx.NumberEntryDialog(None, "Text size", "%s: " % a, "Window size entry", 100, 50, 200)
if d.ShowModal() == wx.ID_OK:
size.append(d.GetValue())
frameNow = myFrame(size, None)
myApp.MainLoop()