2013-01-13 62 views
4

我正在嘗試創建具有默認高度但自定義寬度的文本控件。這是我當前的代碼:如何修改wxPython中TextCtrl的寬度?

tc = wx.TextCtrl(self, -1) 
tc.Size.SetWidth(300) 

文本控件的寬度保持不變,但。改變寬度後,我也嘗試調用tc.Layout(),結果沒有。我不想在類構造函數中輸入自定義大小,因爲我希望它使用默認高度。我也曾嘗試更加冗長,萬一tc.GetSize返回Size對象的深副本:

tc = wx.TextCtrl(self, -1, size=(300, 23)) 

tc_size = tc.Size 
tc_size.SetWidth(300) 

tc.Size = tc_size 
tc.Layout() 

也無濟於事。爲什麼我的代碼無法正常工作,以及如何使其工作?


設置在構造尺寸的作品,所以篩分器是無關的問題。

回答

8

我只注意到我可以通過(300, -1)作爲文本控件的大小:

wx.TextCtrl(self, -1, size=(300, -1)) 

導致使用默認的高度文本控件。這解決了我的問題,但沒有從技術上回答我的問題,所以我支持更好的答案。


編輯:此答案加上下面的評論回答我的問題。

+0

@ tom10:我的問題是關於修改文本控件的寬度,而不是在構造函數中傳遞大小。 – Hubro

+0

txt.SetSize((300,-1))會發生什麼? –

+0

@PaulMcNett:什麼都沒有。文本控件保持其默認大小。 – Hubro

4

你應該讓sizers控制你的控件的大小,而不是明確地設置它們。

import wx 

class Frm(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     super(Frm, self).__init__(*args, **kwargs) 
     txt = wx.TextCtrl(self) 
     s = wx.BoxSizer(wx.HORIZONTAL) 
     s.Add(txt, 1) 
     self.SetSizer(s) 
     self.Layout() 


app = wx.PySimpleApp() 
frame = Frm(None) 
frame.Show() 
app.MainLoop() 

這可以讓控件在你的代碼的一般指導下彼此相對。因此,例如,在Mac和Windows上運行相同的代碼仍然會產生一個很好的佈局。

我意識到這並不能直接回答你的問題,但是如果你沒有意識到它們的存在,就會想把你推到sizers。在編寫和維護用戶界面佈局時,需要花費大量的精力。

+0

+1我使用sizer進行佈局,但我有一個特定的寬度I想要我的文本控件,我希望對話框的大小與控件所需要的一樣大,而不是相反。但感謝您的答案。 – Hubro

+2

在這種情況下,您確實想要顯式設置寬度,但將高度保留爲默認值,並且我知道這樣做的方式是您的原始發現(SetSize((desired_width,-1)))。 –

+0

但我的問題表明'SetSize'對大小沒有影響 – Hubro