帧中textctrl的动态宽度

时间:2015-10-14 13:45:52

标签: wxpython

我在flexgridsizer(3,1)中有一个包含三个小部件的基本框架。标题标签,文本控件和按钮。 textctrl从test.txt文件填充,其内容未定义但通常具有固定宽度。 (通常为80或120个字符)。

我想让面板自动创建一个合适的宽度以完美地包含文字,但目前它看起来并不正确(左边没有边框但是在文本末尾和滚动条之间右侧有一个明显的空白/间隙。)

我的问题是这些:

  1. 是否有更好的方法让wx自动计算所需的帧宽度并根据所包含的文本应用它?我查看了所有GetSize,GetBestSize,GetClientSize,GetVirtualSize等函数,并且没有返回接近我所调用的值的值(DC方法返回的值)。
  2. SystemSettings.GetMetric返回的滚动条的宽度很远。它返回15px但实际上它实际上只有3个(在Ubuntu 14.04上运行)。这是我认为对我不利的一半原因。这是获得滚动条宽度的正确方法还是有更好的方法?
  3. 关于如何清理它的任何其他建议将非常感激。下面是代码和文本文件的示例位。

    import wx
    import wx.lib.stattext as ST
    
    class TextFrame(wx.Frame):
        def __init__(self, parent, id):
            wx.Frame.__init__(self, parent, id, style = wx.STAY_ON_TOP)
    
            self.lbl_title = ST.GenStaticText(self, wx.ID_ANY, "What's Changed?", style = wx.ALIGN_CENTER)
            self.txt_changes = wx.TextCtrl(self, -1, "", style = wx.TE_MULTILINE | wx.TE_READONLY)
            self.btn_ok = wx.Button(self, wx.ID_OK, "OK")
            self.btn_ok.SetDefault()
    
            self.__set_properties()
            self.__do_layout()
    
            self.Bind(wx.EVT_BUTTON, self.OnOK, self.btn_ok)
    
    
        def __set_properties(self):
            font = self.txt_changes.GetFont()
            font = wx.Font(font.GetPointSize(),
                           wx.TELETYPE,
                           font.GetStyle(),
                           font.GetWeight(),
                           font.GetUnderlined())
    
            self.txt_changes.SetFont(font)
    
            self.txt_changes.SetValue(open("test.txt", "r").read())
    
            self.btn_ok.SetFocus()
    
    
        def __do_layout(self):
            sizer = wx.FlexGridSizer(3, 1, 0, 0)
            sizer.AddGrowableCol(0)
            sizer.AddGrowableRow(1)
    
            sizer.Add(self.lbl_title, 0, wx.EXPAND, 0)
            sizer.Add(self.txt_changes, 0, wx.EXPAND, 0)
            sizer.Add(self.btn_ok, 0, wx.ALIGN_CENTER, 0)
    
            self.SetSizer(sizer)
    
            # Dynamically calculate the width of text and use it to set the width of the frame.
            dc = wx.ScreenDC()
            dc.SetFont(self.txt_changes.GetFont())
            w = dc.GetMultiLineTextExtent(self.txt_changes.GetValue())[:1]
            w = (w[0] + wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X))
            size = self.GetSize()
            size = (w, size[1])
            self.SetSize(size)
    
            self.Layout()
            self.CenterOnScreen()
    
    
        def OnOK(self, event):
            self.Destroy()
    
    
    if __name__ == "__main__":
        app = wx.App()
        t = TextFrame(None, -1)
        t.Show()
        app.MainLoop()
    

    这是test.txt的一些废话内容:

    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    ================================================================================
    ================================================================================
    ================================================================================
    fsdaeryw5etyiuoht oyt934y tq43eyt 9p3qy4 5p93qy tqp983y4 tpq38ytp9y3 tpq t  q34t
     34qo p394yt 93qpy 5q3p94yt erig r gye  tyepy tpyt paytpey4 tpe ytae ytpa4 twa 
    

1 个答案:

答案 0 :(得分:0)

这个怎么样:

import wx
import wx.lib.stattext as ST

class TextFrame(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, style = wx.STAY_ON_TOP)

        self.lbl_title = ST.GenStaticText(self, wx.ID_ANY, "What's Changed?", style = wx.ALIGN_CENTER)
        self.txt_changes = wx.TextCtrl(self, -1, "", style = wx.TE_MULTILINE | wx.TE_READONLY)
        self.btn_ok = wx.Button(self, wx.ID_OK, "OK")
        self.btn_ok.SetDefault()

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnOK, self.btn_ok)


    def __set_properties(self):
        font = self.txt_changes.GetFont()
        font = wx.Font(font.GetPointSize(),
                       wx.TELETYPE,
                       font.GetStyle(),
                       font.GetWeight(),
                       font.GetUnderlined())

        self.txt_changes.SetFont(font)

        tv = open("test.txt", "r")

        # dynamic sizing
        l1 = tv.readline()
        tv.seek(0) # reset to beginning of file
        lw = self.txt_changes.GetTextExtent(l1)
        # on Windows this is 17
        scw = wx.SystemSettings.GetMetric(wx.SYS_VSCROLL_X)
        # still need to adjust, I think it is the small border
        scw += 2 
        self.SetBestFittingSize((lw[0] + scw, self.GetSize()[1]))

        self.txt_changes.SetValue(tv.read())

        self.btn_ok.SetFocus()


    def __do_layout(self):
        sizer = wx.FlexGridSizer(0, 1, 0, 0)
        sizer.AddGrowableCol(0)
        sizer.AddGrowableRow(1)

        sizer.Add(self.lbl_title, 0, wx.EXPAND, 0)
        sizer.Add(self.txt_changes, 1, wx.EXPAND, 0)
        sizer.Add(self.btn_ok, 0, wx.ALIGN_CENTER, 0)

        self.SetSizer(sizer)

        self.Layout()
        self.CenterOnScreen()


    def OnOK(self, event):
        self.Destroy()


if __name__ == "__main__":
    app = wx.App()
    t = TextFrame(None, -1)
    t.Show()
    app.MainLoop()