2013-11-25 31 views
0

我有一個wxApplication幾個wxTextCtrl,例如:wx.TextCtrl改變mousehover

self.tc1 = wx.TextCtrl(self.panel,-1,pos=(100,150),size=(60,20)) 
self.tc2 = wx.TextCtrl(self.panel,-1,pos=(100,170),size=(60,20)) 
self.tc3 = wx.TextCtrl(self.panel,-1,pos=(100,190),size=(60,20)) 
self.tc_all = [self.tc1, self.tc2, self.tc3] 

用戶輸入不同的值,並點擊一個按鈕,我想輸入的值進行排序,例如後用戶輸入這樣的:

>>> values = [self.tc1.GetValue(), self.tc2.GetValue(), self.tc3.GetValue()] 
>>> print values 
[2,1,3] 

我想這些值進行排序,並改變它的TextCtrls裏面,所以我做的:

values.sort() 
for i in range(len(values)): 
    self.tc_all[i].SetValue(values[i]) 

首先值正確更改,但是當我將鼠標懸停在每個TextCtrl上時,它們將變回舊值。我試圖添加一個self.panel.Layout(),但問題仍然存在。

編輯:我改變了我的分級機的設置,現在我的值不會發生變化 - 但我不知道什麼是錯的:

self.inputsizer = wx.BoxSizer(wx.VERTICAL) 
for i in range(self.ticks): 
    self.inputsizer.Add(self.tc_all[i], 0, wx.ALL|wx.EXPAND, 2) 
self.inputpanel.SetSizer(self.inputsizer) 

,並在我的事件(當輸入應進行排序):

self.inputsizer.Layout() 

編輯2:它遠離原來的問題,不知道我是否應該開始一個新的問題?! 說明:在class interpolation的某處我保存了一個圖像('tmp.png'),我想在Panel pageThree上顯示它。當我不畫任何圖像時,一切正常。但是,繪製圖像是我的程序的重要組成部分,所以在這裏出現兩個問題:1)我的值在TextCtrls內部「隱藏」:在mousehover之後,它們按預期顯示(排序)。 2)繪製了錯誤的圖像:第一次點擊我的按鈕時,我的面板截圖爲圖像;當我按下按鈕兩次,繪製正確的圖像。

import wx 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, 
          "Pyramid App",size=(800,600),pos=((wx.DisplaySize()[0]-800)/2,(wx.DisplaySize()[1]-600)/2),style= wx.SYSTEM_MENU | wx.CAPTION | wx.MINIMIZE_BOX | wx.CLOSE_BOX) 

     self.p = wx.Panel(self,size=(800,600),pos=(0,0)) 
     self.p.Hide() 
     self.PageThree = pageThree(self) 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(self.PageThree, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 
     self.Layout() 

class pageThree(wx.Panel): 
    def __init__(self, parent): 
     wx.Panel.__init__(self, parent=parent,size=(800,525)) 
     self.myparent=parent 
     self.pageThree=wx.Panel(self,size=(800,525)) 
     self.widgets() 

    def widgets(self): 
     self.ticks = 10 
     self.tc_all = [None for i in range(self.ticks)] 
     self.inputsizer = wx.BoxSizer(wx.VERTICAL) 
     for i in range(self.ticks): 
      self.tc_all[i] = wx.TextCtrl(self.pageThree, pos=(20+10+160*(i/10),265+10+25*(i%10)),size=(80,20)) 
      self.inputsizer.Add(self.tc_all[i], 0, wx.ALL|wx.EXPAND, 2) 
     self.pageThree.SetSizer(self.inputsizer) 

     self.startBtn = wx.Button(self.pageThree,label="button",pos=(350,102),size=(100,30)) 
     self.Bind(wx.EVT_BUTTON, self.start, self.startBtn) 

    def start(self, event): 
     h = [] 
     for i in range(self.ticks): 
      val = self.tc_all[i].GetValue() 
      if not (val==''): 
       h.append(float(val)) 
     h.sort() 
     h.reverse() 
     hh = h + ['']*(self.ticks-len(h)) 
     for i in range(self.ticks): 
      self.tc_all[i].SetValue(str(hh[i])) 

     self.interp = interpolation(self.myparent) 
     self.interp.run(h) 

    def UpdatePicture(self): 
     bitmap = wx.Bitmap('tmp.png', type=wx.BITMAP_TYPE_PNG) 
     bitmap = self.scale_bitmap(bitmap, 400, 390) 
     control = wx.StaticBitmap(self.pageThree, -1, bitmap) 
     control.SetPosition((350,135)) 

    def scale_bitmap(self, bitmap, width, height): 
     image = wx.ImageFromBitmap(bitmap) 
     image = image.Scale(width, height, wx.IMAGE_QUALITY_HIGH) 
     result = wx.BitmapFromImage(image) 
     return result 

class interpolation(): 
    def __init__(self, parent): 
     self.myparent=parent 
     self.page3 = pageThree(self.myparent) 

    def run(self, h): 
     self.page3.UpdatePicture() 

if __name__ == "__main__": 
    app = wx.App() 
    MainFrame().Show() 
    app.MainLoop() 
+0

我有類似的怪異行爲,它與我的sizers有關。你如何設置這些設置? – wnnmaw

+0

剛編輯我的問題。 – Munchkin

+0

你可以發佈一個精簡版的代碼,以便我可以嘗試幾件事情嗎? – wnnmaw

回答

1

好了,問題是你如何訪問信息,試圖通過篩分器得到它:

self.tc_all = [] 
for child in self.inputsizer.GetChildren(): 
    self.tc_all.append(child.GetWindow().GetValue()) 

self.tc_all = sorted(self.tc_all) 

for child,item in zip(self.inputsizer.GetChildren(),self.tc_all): 
    child.GetWindow().SetValue(item) 

self.inputsizer.Layout() 

因此,這裏是什麼怎麼回事。每個sizer都有稱爲「sizer項目」的子項(文檔here),它們是GUI上項目的表示。在任何sizer上調用GetChildren()將返回所有sizer的sizer項目列表。請注意,這些是自己記錄的項目,所以您需要再走一步,那就是GetWindow()函數。對於sizer項目,GetWindow()的結果是返回sizer項目表示的實際項目(或小部件),如果是TextCtrl項目。一旦你有了,你可以像平常一樣對待。

使用在包含多個項目分級機的GetChildren()功能時要小心,因爲它返回所有孩子。所以,如果你試圖調用的東西,不支持該方法,例如SetValue()StaticText

希望你的代碼將打破這有助於

編輯:實際的答案是與嵌套板造成施膠劑的問題。編輯嵌套面板中的sizer會導致問題中出現的奇怪行爲。

+0

謝謝!但它仍然不起作用。首先,在最後一行中必須是* str(item)*而不是* item *。但這不是問題。在鼠標懸停時,TextCtrls仍然(或再次)變爲舊值。 – Munchkin

+0

btw:在我的示例中* self.tc_all *是一個包含我所有TextCtrls的列表,而不是具有它們值的列表。我用一個正常的循環* values.append(self.tc_all [i] .GetValue())*來獲取值,而不是使用前三行 - 但這不是問題,因爲在這兩種情況下,我們都會得到一個列表所有TextCtrls的(排序的)值。 – Munchkin

+0

是的,我認爲使用'''self.tc_all'''作爲值列表會更容易,因爲您可以將它作爲排序列表存儲。關於你的第一條評論,你不應該需要''str(item)'',因爲列表是值(它們都應該是字符串)。它給你什麼類型的價值?另外,我在我的回答中添加了一行 – wnnmaw