【问题标题】:wxPython: How to clear default text in TextCtrl with one clickwxPython:如何一键清除TextCtrl中的默认文本
【发布时间】:2025-12-24 22:35:16
【问题描述】:

我正在使用 wxPython 制作一个 GUI,并且我有一个需要用户输入的文本框:

self.boxQuantity = wx.TextCtrl(panel, value="Enter quantity", pos=(100, 150), size=(100, 30))
self.Bind(wx.EVT_TEXT, self.getQuantity, self.boxQuantity)

我希望用户能够单击文本框,并且“输入数量”立即消失,而不必使用退格键。这可能吗?

我使用的是 Windows 10,Python 2.7.9。

【问题讨论】:

    标签: python user-interface wxpython


    【解决方案1】:

    我想你想要

    def toggle1(evt):
        if self.boxQuantity.GetValue() == "Enter quantity":
            self.boxQuantity.SetValue("")
        evt.Skip()
    def toggle2(evt):
        if self.boxQuantity.GetValue() == "":
            self.boxQuantity.SetValue("Enter quantity")
        evt.Skip()    
    
    self.boxQuantity.Bind(wx.EVT_FOCUS,toggle1)
    self.boxQuantity.Bind(wx.EVT_KILL_FOCUS,toggle2)
    

    创建一个子类可能更好

    import wx
    class PlaceholderTextCtrl(wx.TextCtrl):
        def __init__(self, *args, **kwargs):
            self.default_text = kwargs.pop("placeholder", "")
            wx.TextCtrl.__init__(self, *args, **kwargs)
            self.OnKillFocus(None)
            self.Bind(wx.EVT_SET_FOCUS, self.OnFocus)
            self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
    
        def OnFocus(self, evt):
            self.SetForegroundColour(wx.BLACK)
            if self.GetValue() == self.default_text:
                self.SetValue("")
            evt.Skip()
    
        def OnKillFocus(self, evt):
            if self.GetValue().strip() == "":
                self.SetValue(self.default_text)
                self.SetForegroundColour(wx.LIGHT_GREY)
            if evt:
                evt.Skip()
    
    # then sometime later...
    
    self.text_entry1 = PlaceHolderTextCtrl(self,-1,placeholder="Enter Value")
    

    至少是这样的......

    【讨论】:

      【解决方案2】:

      我知道这个问题很老了,但是 wxPython 现在(4.1)有一个新的 SetHint 函数用于 TextCtrl

      text = wx.TextCtrl(self)
      text.SetHint('First name')  # This text is grey, and disappears when you type
      

      【讨论】: