我在flexgridsizer(3,1)中有一个包含三个小部件的基本框架。标题标签,文本控件和按钮。 textctrl从test.txt文件填充,其内容未定义但通常具有固定宽度。 (通常为80或120个字符)。
我想让面板自动创建一个合适的宽度以完美地包含文字,但目前它看起来并不正确(左边没有边框但是在文本末尾和滚动条之间右侧有一个明显的空白/间隙。)
我的问题是这些:
关于如何清理它的任何其他建议将非常感激。下面是代码和文本文件的示例位。
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
答案 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()