2014-09-06 13 views
1

我正在創建一個基於wxPython的GUI(我的第一次創建GUI的經驗)。 GUI的幾個元素是文本輸入字段,用戶可以將數據輸入到文本字段(例如TextCtrl)中。wxPython文本字段輸入包括文本輸入事件和單擊文本字段事件內部的特殊效果

我試圖在文本輸入字段中創建一個共同的效果,其中,在數據輸入到文本字段之前,應該在文本字段中放置什麼的默認指示(例如「在此處輸入數據」)在輸入任何文本之前,它都是灰顯的。如果該字段缺少用戶輸入,我希望這個默認指示再次出現。

這類問題的一個很好的例子是在stackoverflow問題條目窗體的「標題」字段中,它寫着「你的編程問題是什麼?具體」。雖然在這種情況下還有另一種效果,當我在文本框內單擊時,文本變爲灰色,並且只有當我輸入時纔會消失。

如果TextCtrl能夠做到這一點,怎麼樣?我試圖做到這一點,但我一直沒有成功。我只想問怎麼做,而不是以身作則證明我是如何失敗的。

是否有我應該使用除TextCtrl這些類型的效果的類?

在下面的代碼中,我試圖只傳達基本部分。我認爲代碼會起作用。

import wx 

class FormTab(wx.Panel): 

    def __init__(self, *args, **kwargs): 
    super(FormTab, self).__init__(*args, **kwargs) 
    self.createControls() 
    self.bindEvents() 
    self.doLayout() 

    def createControls(self): 
    self.exeTextCtrl = wx.TextCtrl(self, value="Executable") 
    font=wx.Font(8,wx.DEFAULT,wx.ITALIC,wx.NORMAL) 
    self.exeTextCtrl.SetFont(font) 

    def bindEvents(self): 
    for control, event, handler in \ 
     [(self.exeTextCtrl, wx.EVT_LEFT_DOWN, self.onExeReady), 
     (self.exeTextCtrl, wx.EVT_TEXT, self.onExeEntered)]: 
     control.Bind(event, handler) 

    def onExeReady(self, event): 
    self.exeTextCtrl.SetValue('') 
    font=wx.Font(8,wx.DEFAULT,wx.NORMAL,wx.NORMAL) 
    self.exeTextCtrl.SetFont(font) 
    event.Skip() 

    def onExeEntered(self, event): 
    exclass.exe=event.GetString() 

    def doLayout(self): 
    raise NotImplementedError # done in parent class 

class FormTabLayout(FormTab): 
    def doLayout(self): 
    boxSizer = wx.BoxSizer(orient=wx.HORIZONTAL) 
    # A GridSizer will contain the other controls: 
    gridSizer = wx.FlexGridSizer(rows=12, cols=1, vgap=10, hgap=10) 
    expandOption = dict(flag=wx.EXPAND) 
    for control, options in \ 
      [(self.exeTextCtrl, expandOption)]: 
     gridSizer.Add(control, **options) 

    for control, options in \ 
      [(gridSizer, dict(border=5, flag=wx.ALL))]: 
     boxSizer.Add(control, **options) 

    self.SetSizerAndFit(boxSizer) 


class Exclas(): 
    def __init__(self): 
    self.exe="" 

class FrameWithForms(wx.Frame): 
    def __init__(self, *args, **kwargs): 
    super(FrameWithForms, self).__init__(*args, **kwargs) 
    notebook = wx.Notebook(self) 
    self.form1 = FormTabLayout(notebook) 
    notebook.AddPage(self.form1, 'Options') # tab 
    self.SetClientSize(notebook.GetBestSize()) 

if __name__=='__main__': 
    exclass=Exclas() 
    app = wx.App(redirect=True, filename='mylog.txt') 
    frame = FrameWithForms(None, title='Example GUI') 
    frame.Show() 
    app.MainLoop() 

謝謝。

+0

我不知道任何內置的類來照顧這個,但你應該能夠捕捉鼠標點擊事件來自己做。這可能有所幫助:http://wxpython-users.1045709.n5.nabble.com/is-it-possible-detect-mouse-click-in-TextCtrl-td2358623.html – Lukeclh 2014-09-06 17:11:35

+1

@Lukeclh謝謝,這是做到了。在閱讀文檔時(作爲GUI的新手),所有Windows事件都可用於所有派生類(因爲TextCtrl源自Windows),我不清楚這一點。查看帖子以進行最終修改。 – jpf 2014-09-07 15:39:03

回答

2

您可以使用SearchFutton中的wx.SearchCtrl,將CancelButton ect設置爲不顯示,並使用SetDescriptiveText方法設置默認文本。

搜索控件是一個添加了功能的wx.TextCtrl。

+0

正是我需要的。謝謝。 – jpf 2014-09-19 12:53:26