2015-07-24 2 views
0

Я написал код для получения некоторых входных данных от пользователя, используя как CheckBox, так и TextCtrl. Проблема заключается в том, что когда я отмечен флажок, и появляется textctrl, он принимает получение входных данных, но не заменяет их по умолчанию!TextCtrl не работает должным образом с CheckBox

import wx 

class mainClass(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 'Interface', size=(500, 250)) 
     self.panel = wx.Panel(self) 

     self.checkReplaceJob = wx.CheckBox(self.panel, -1, "Replace data", (35, 60), (235, 20)) 
     self.Bind(wx.EVT_CHECKBOX, self.replaceJob, self.checkReplaceJob) 

     self.RunBut = wx.Button(self.panel, -1, "Run", pos=(150, 150)) 
     self.Bind(wx.EVT_BUTTON, self.RunClick, self.RunBut) 
     self.RunBut.SetDefault() 
     self.CloseBut = wx.Button(self.panel, -1, "Close", pos=(250, 150)) 
     self.Bind(wx.EVT_BUTTON, self.CloseClick, self.CloseBut) 

    def CloseClick(self, event): 
     self.Close() 

    def replaceJob(self, event): 
     if(self.checkReplaceJob.IsChecked()): 
      self.repJobRetName() 
      self.btn = wx.Button(self.panel, wx.ID_ANY, "&Help", pos=(345, 82)) 
      self.Bind(wx.EVT_BUTTON, self.HelpJobName, self.btn) 

    def repJobRetName(self): 
     self.label = wx.StaticText(self.panel, -1, label = "New name:", pos=(165,87)) 
     self.entry = wx.TextCtrl(self.panel, -1, value = u"Task-1", pos=(230, 84)) 
     repJobName = self.entry.GetValue() 
     return repJobName 

    def HelpJobName(self, event): 
     help = 'Write out new name.' 
     wx.MessageBox(help, "Help") 

    def RunClick(self, event): 
     if(self.checkReplaceJob.IsChecked()): 
      replaceName = self.repJobRetName() 
      wx.MessageBox('The new name is: ' + replaceName, "Info") 

#############======================= 
if __name__ == "__main__": 
    app = wx.App(False) 
    mainClass().Show() 
    app.MainLoop() 

ответ

0

Позвольте мне убедиться, что я правильно понял. Вы хотите, чтобы элемент управления текстом имел значение по умолчанию при его создании, но вы хотите, чтобы это значение исчезло, когда вы фактически выбираете элемент управления. Это верно? Если это так, то вам просто нужно добавить привязку к wx.EVT_SET_FOCUS и сделать небольшую работу, когда виджет получит фокус. Вот пример:

import wx 

class mainClass(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, -1, 'Interface', size=(500, 250)) 
     self.panel = wx.Panel(self) 

     self.checkReplaceJob = wx.CheckBox(self.panel, -1, "Replace data", (35, 60), (235, 20)) 
     self.Bind(wx.EVT_CHECKBOX, self.replaceJob, self.checkReplaceJob) 

     self.RunBut = wx.Button(self.panel, -1, "Run", pos=(150, 150)) 
     self.Bind(wx.EVT_BUTTON, self.RunClick, self.RunBut) 
     self.RunBut.SetDefault() 
     self.CloseBut = wx.Button(self.panel, -1, "Close", pos=(250, 150)) 
     self.Bind(wx.EVT_BUTTON, self.CloseClick, self.CloseBut) 

    def CloseClick(self, event): 
     self.Close() 

    def replaceJob(self, event): 
     if(self.checkReplaceJob.IsChecked()): 
      self.repJobRetName() 
      self.btn = wx.Button(self.panel, wx.ID_ANY, "&Help", pos=(345, 82)) 
      self.Bind(wx.EVT_BUTTON, self.HelpJobName, self.btn) 

    def repJobRetName(self): 
     self.label = wx.StaticText(self.panel, -1, label = "New name:", pos=(165,87)) 
     self.entry = wx.TextCtrl(self.panel, -1, value = u"Task-1", pos=(230, 84)) 
     self.entry.Bind(wx.EVT_SET_FOCUS, self.onFocus) 
     repJobName = self.entry.GetValue() 
     return repJobName 

    def onFocus(self, event): 
     current_value = self.entry.GetValue() 
     if current_value == "Task-1": 
      self.entry.SetValue("") 

    def HelpJobName(self, event): 
     help = 'Write out new name.' 
     wx.MessageBox(help, "Help") 

    def RunClick(self, event): 
     if(self.checkReplaceJob.IsChecked()): 
      replaceName = self.repJobRetName() 
      wx.MessageBox('The new name is: ' + replaceName, "Info") 

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

Эта функция 'onFocus' просто удаляет имя по умолчанию. Мне нужно заменить имя по умолчанию новой вставкой имени пользователем. –

+0

Да, пользователь набрал бы там новое имя. Как еще они вставляют новое имя? –

+0

Проблема заключается в том, что когда я использую функцию 'onFocus' и набираю новое имя, программа по-прежнему использует старое имя. –

Смежные вопросы