Search code examples
pythonwxpythonreal-time

Numeric Keyboard


I would like to design a numeric keyboard and I do not know which function to use to have real time display when I clicked a button, say 1 is displayed in the textctrl when the button 1 is clicked like a calculator display. And it can display like 1234 when 1234 buttons are clicked in series. And I wonder how can I add backspace, clear functions to that

import wx

class iCal(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Text")
        panel = MainPanel(self)

class MainPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent)
        self.frame = parent 

        text_1 = wx.TextCtrl(self, value=float(num))

        button_0 = wx.Button(self, label="0")        
        button_1 = wx.Button(self, label="1")
        button_2 = wx.Button(self, label="2")

        button_0.Bind(wx.EVT_LEFT_DOWN,self.output0)
        button_1.Bind(wx.EVT_LEFT_DOWN,self.output1)
        button_2.Bind(wx.EVT_LEFT_DOWN,self.output2)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(text_1, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(button_0, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(button_1, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(button_2, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)

    def self.output0(self,event):
        if float(num) > 0:
            num = num + str(0)

    def self.output1(self,event):
        num = num + str(1)

    def self.output1(self,event):
        num = num + str(1)



if __name__ == '__main__':
    app = wx.App(False)
    frame = iCal()
    frame.Show()
    app.MainLoop()

Numberic Keyboard


Solution

  • import wx
    
    class iCal(wx.Frame):
    
        def __init__(self):
            wx.Frame.__init__(self, None, wx.ID_ANY, "Text")
            panel = MainPanel(self)
    
    class MainPanel(wx.Panel):
    
        def __init__(self, parent):
            wx.Panel.__init__(self, parent=parent)
            self.frame = parent
            self.text_1 = wx.TextCtrl(self, value="0")
            button_0 = wx.Button(self, label="0")
            button_1 = wx.Button(self, label="1")
            button_2 = wx.Button(self, label="2")
            clear = wx.Button(self, label="Clear")
    
            button_0.Bind(wx.EVT_LEFT_DOWN,self.output0)
            button_1.Bind(wx.EVT_LEFT_DOWN,self.output1)
            button_2.Bind(wx.EVT_LEFT_DOWN,self.output2)
            clear.Bind(wx.EVT_LEFT_DOWN,self.clear)
    
            sizer = wx.BoxSizer(wx.VERTICAL)
            sizer.Add(self.text_1, 0, wx.ALL|wx.CENTER, 5)
            sizer.Add(button_0, 0, wx.ALL|wx.CENTER, 5)
            sizer.Add(button_1, 0, wx.ALL|wx.CENTER, 5)
            sizer.Add(button_2, 0, wx.ALL|wx.CENTER, 5)
            sizer.Add(clear, 0, wx.ALL|wx.CENTER, 5)
            self.SetSizer(sizer)
    
        def output0(self,event):
            num = "0"
            my_string = self.text_1.GetValue() + num
            self.text_1.SetValue(my_string)
    
        def output1(self,event):
            num = "1"
            my_string = self.text_1.GetValue() + num
            self.text_1.SetValue(my_string)
    
        def output2(self,event):
            num = "2"
            my_string = self.text_1.GetValue() + num
            self.text_1.SetValue(my_string)
    
        def clear(self,event):
            my_string = self.text_1.GetValue()
            my_string = my_string[:len(my_string)-1]
            self.text_1.SetValue(my_string)
    
    if __name__ == '__main__':
        app = wx.App(False)
        frame = iCal()
        frame.Show()
        app.MainLoop()
    
    1. If you are going to post code, at least run it first to make sure that you aren't posting rubbish.
    2. Read about manipulating strings before you post: Strings