2011-09-14 29 views
2

這是我非常沮喪的問題之一,因爲我確信答案已經存在,我只是無法正確地對搜索進行說明。基本上我是GUI編程的新手(完成了大量嵌入式C/C++)並學習了wxPython。從列表中生成wxPython窗口小部件組

我在製作應用程序來讀取和寫入配置文件。所以我有一個StaticText來顯示要讀取/寫入的參數的名稱,一個TextCtrl來顯示值並允許用戶輸入,然後是一個Get按鈕和一個Set按鈕。我會把所有這些組件一起調用一個「小組」組件。對於這個應用程序,顯然這個組將重複多次。我認爲只需簡單地列出一個我想要編輯的配置參數列表,然後遍歷列表並生成這個「組」的實例,就可以更容易地編寫和維護所有代碼了。列表中每個項目的小部件。除了一件事我做了它的工作:我必須將所有的Get按鈕綁定到同一個函數。與Set按鈕相同的東西。有沒有什麼辦法可以從這些函數中知道哪個Get或Set按鈕被按下,從而在配置文件中找到並編輯哪個參數?我確信有一種方法可以通過父母或身份證或其他方式來做到這一點,但我對OOP太新了。

回答

1

在您的按鈕的事件處理一個截圖,你可以做這樣的事情:

btn = event.GetEventObject() 
btn.GetId() 
btn.GetName() 

然後你只需使用IF語句來決定做依據是什麼無論你想使用的信息。注:

setBtn = wx.Button(self, label="Set", name="SetX") 

您可能會發現這篇文章的wxPython和ConfigObj也有幫助:當你創建一個這樣的按鈕,可以設置按鈕的名稱http://www.blog.pythonlibrary.org/2010/01/17/configobj-wxpython-geek-happiness/

+0

後續問題:我確定哪個按鈕被點擊後,我如何訪問相應的文本框讀取/寫入值?有沒有辦法將類似於我正在使用的文本框的指針列表存儲起來,然後遍歷該列表並比較每個文本框的名稱,直到找到合適的文本框? – anderspitman

+0

I don不要以爲按鈕的支持客戶端數據,所以你最好創建一個字典,並使用按鈕的唯一名稱映射到文本控件,比如self.myDict = {「firstBtn」:firstTxt}。使用按鈕的名稱映射到文本控件。 –

2

我假定get按鈕從配置文件讀取參數值並顯示該值。

爲什麼每個參數需要一個獲取按鈕?我只需要一個獲取按鈕即可。當用戶單擊獲取按鈕時,將從文件中讀取每個參數並更新所有顯示。

設置按鈕的類似方法。一個設置按鈕全部 - 當按下按鈕時,每個輸入了新值的參數都會在配置文件中更新。用戶未輸入新值的參數保留其先前的值。

該方案更容易編碼,而且對用戶也更容易。

但是,我真的建議你看看wxPropertyGrid部件。這有可能讓你的生活變得更輕鬆!下面是顯示在行動

enter image description here

+0

很好的建議,謝謝。 – anderspitman

+0

upvote會很好。 – ravenspoint

+0

還沒有足夠的代表,但當我做我會回來(: – anderspitman

0

您可以從wx.Button派生自己的類添加一個或多個屬性,使按鈕記住您想要的任何信息。

您可以在回調函數調用期間使用此存儲的信息。喜歡的東西:

import wx 

L = [("1", "One"), ("2", "Two"), ("3", "Three")] 

# ===================================================================== 
class MemoryButton(wx.Button): 
    def __init__(self, memory, *args, **kwargs): 
     wx.Button.__init__(self, *args, **kwargs) 
     self.memory = memory 

# ===================================================================== 
class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.buttons = [] 
     for description in L: 
      button = MemoryButton(memory=description[1], parent=self.panel, 
            label=description[0]) 
      button.Bind(wx.EVT_BUTTON, self.OnMemoryButton) 
      self.buttons.append(button) 

     self.sizer = wx.BoxSizer() 
     for button in self.buttons: 
      self.sizer.Add(button) 

     self.panel.SetSizerAndFit(self.sizer) 
     self.Show() 

    # ----------------------------------------------------------------- 
    def OnMemoryButton(self, e): 
     print("Clicked '%s'" % e.GetEventObject().memory) 

# ===================================================================== 
app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 

或者:

import wx 

L = [("1", "One"), ("2", "Two"), ("3", "Three")] 

# ===================================================================== 
class MemoryButton(wx.Button): 
    def __init__(self, memory, *args, **kwargs): 
     wx.Button.__init__(self, *args, **kwargs) 
     self.memory = memory 

    def OnButton(self, e): 
     print("Clicked '%s'" % self.memory) 

# ===================================================================== 
class MainWindow(wx.Frame): 
    def __init__(self, *args, **kwargs): 
     wx.Frame.__init__(self, *args, **kwargs) 

     self.panel = wx.Panel(self) 
     self.buttons = [] 
     for description in L: 
      button = MemoryButton(memory=description[1], parent=self.panel, 
            label=description[0]) 
      button.Bind(wx.EVT_BUTTON, button.OnButton) 
      self.buttons.append(button) 

     self.sizer = wx.BoxSizer() 
     for button in self.buttons: 
      self.sizer.Add(button) 

     self.panel.SetSizerAndFit(self.sizer) 
     self.Show() 

# ===================================================================== 
app = wx.App(False) 
win = MainWindow(None) 
app.MainLoop() 
相關問題