TextCtrl не работает должным образом с CheckBox

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

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()

1 ответ

Позвольте мне убедиться, что я правильно понимаю. Вы хотите, чтобы текстовый элемент управления имел значение по умолчанию при его создании, но вы хотите, чтобы это значение исчезало, когда вы фактически выбираете элемент управления. Это верно? Если это так, то вам просто нужно добавить привязку к 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()
Другие вопросы по тегам