wxPython mulltiline文本框对wx.Frame来说太大的问题 - 我可以自动“缩小”到文本框的正确大小吗?

时间:2011-04-08 03:42:28

标签: python wxpython

不确定我是否正确地问这个问题(例如在正确的上下文中使用widget / object)。这段代码只是作为一个实验(现在学习类和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 个答案:

答案 0 :(得分:2)

杰克指出你正确的方向,但还有一件事。你应该知道进入框架的第一个对象被包装到基本的sizer中。问题是,据我所知,你无法控制这个分级器。因此,您必须添加自己的sizer,您可以使用它来进行框架拟合。您需要控制sizer,因为您希望框架根据sizer更改其大小。

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

答案 1 :(得分:1)

您需要使用sizer(或sizer),然后在添加时指定wx.EXPAND以使其适合水平的sizer并使wx.ALL垂直适合。

在此处查看sizer文档:http://wiki.wxpython.org/Getting%20Started#Sizers

实际上,您可能希望阅读整个“使用Windows”部分,非常有用。