Обновление статической метки в wxpython при запуске события

#python #event-handling #wxpython

Вопрос:

Я создаю приложение, которое покажет основную информацию о мотоцикле, такую как обороты в минуту и передача, в которой он находится. Допустим, мы переключаем передачу с помощью «нажатия кнопки клавиатуры», как я могу заставить его обновить этикетку. Предположим, что эквивалентным ключом будет клавиша «ВВЕРХ», чтобы подняться, до сих пор это то, что я придумал, но метка не будет обновляться при запуске события. Что я могу делать не так?

 import wx
import sys

var =int(sys.argv[1])
gr = "N" 

class MyFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
        wx.Frame.__init__(self, *args, **kwds)
        self.SetSize((400, 300))
        self.gauge_1 = wx.Gauge(self, wx.ID_ANY, 10000, style=wx.GA_HORIZONTAL | wx.GA_SMOOTH)
        
        self.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
        
        self.__set_properties()
        self.__do_layout()

    def __set_properties(self):
        self.SetTitle("Test")
        self.gauge_1.SetBackgroundColour(wx.Colour(216, 216, 191))
        self.gauge_1.SetForegroundColour(wx.Colour(128, 0, 206))
        self.gauge_1.SetFont(wx.Font(11, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, "Ubuntu"))
        self.gauge_1.SetValue(var)

    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_1.Add(self.gauge_1, 0, wx.EXPAND, 0)
        label_1 = wx.StaticText(self, wx.ID_ANY, "GEAR")
        label_1.SetMinSize((100, 50))
        label_1.SetForegroundColour(wx.Colour(0, 137, 215))
        label_1.SetFont(wx.Font(25, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_ITALIC, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_1.Add(label_1, 0, wx.ALL, 3)
        Gearind = wx.StaticText(self, wx.ID_ANY, gr, style=wx.ALIGN_CENTER)
        Gearind.SetMinSize((50, 43))
        Gearind.SetForegroundColour(wx.Colour(122, 0, 7))
        Gearind.SetFont(wx.Font(32, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_SLANT, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_1.Add(Gearind, 0, 0, 0)
        self.SetSizer(sizer_1)
        self.Layout()


    def OnKeyUp(self, evt):
        code = evt.GetKeyCode()
        
        if code == wx.WXK_UP:
            gr = "1"
            self.Gearind.SetLabel(gr)
        elif code == wx.WXK_DOWN:
            evt.Skip()



class MyApp(wx.App):
    def OnInit(self): 
        self.Test = MyFrame(None, wx.ID_ANY, "")
        self.SetTopWindow(self.Test)
        self.Test.Show()
        return True



if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()
 

Ответ №1:

Я не верю, что a Frame принимает символы.
Используйте a wx.Window со стилем wx.WANTS_CHARS или a wx.Panel

То, что вы хотите обновить, не поможет self.Gearind , но вы определили его как local Gearind т. Е.

Ниже я добавил панель и несколько других настроек (обратите внимание на значение датчика).

Возможно, вы захотите изучить wxpython SpeedMeter , который может добавить что-то Vroooom! в вашу программу.

 import wx
import sys

try:
    var =int(sys.argv[1])
except Exception:
    var = 0
gr = "N" 

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, wx.ID_ANY)
        self.SetSize((400, 300))
        self.panel = wx.Panel(self, wx.ID_ANY)
        self.gauge_1 = wx.Gauge(self.panel, wx.ID_ANY, 6, style=wx.GA_HORIZONTAL | wx.GA_SMOOTH)
        
        self.panel.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
        
        self.__set_properties()
        self.__do_layout()

    def __set_properties(self):
        self.SetTitle("Test")
        #self.gauge_1.SetBackgroundColour(wx.Colour(216, 216, 191))
        #self.gauge_1.SetForegroundColour(wx.Colour(128, 0, 206))
        #self.gauge_1.SetFont(wx.Font(11, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, 0, "Ubuntu"))
        self.gauge_1.SetValue(var)

    def __do_layout(self):
        sizer_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_1.Add(self.gauge_1, 0, wx.EXPAND, 0)
        label_1 = wx.StaticText(self.panel, wx.ID_ANY, "GEAR")
        label_1.SetMinSize((100, 50))
        label_1.SetForegroundColour(wx.Colour(0, 137, 215))
        label_1.SetFont(wx.Font(25, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_ITALIC, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_1.Add(label_1, 0, wx.ALL, 3)
        self.Gearind = wx.StaticText(self.panel, wx.ID_ANY, gr, style=wx.ALIGN_CENTER)
        self.Gearind.SetMinSize((50, 43))
        self.Gearind.SetForegroundColour(wx.Colour(122, 0, 7))
        self.Gearind.SetFont(wx.Font(32, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_SLANT, wx.FONTWEIGHT_NORMAL, 0, ""))
        sizer_1.Add(self.Gearind, 0, 0, 0)
        self.panel.SetSizer(sizer_1)
        self.Layout()


    def OnKeyUp(self, evt):
        code = evt.GetKeyCode()
        gr = self.Gearind.GetLabel()
        if gr.isnumeric():
            gr_up = int(gr)   1
            gr_down = int(gr) - 1
        else:
            gr_up = 1
            gr_down = 0
        if gr_up > 6:
            gr_up = 6
        if gr_down < 1:
            gr_down = "N"
        if code == wx.WXK_UP:
            self.Gearind.SetLabel(str(gr_up))
        elif code == wx.WXK_DOWN:
            self.Gearind.SetLabel(str(gr_down))
        gr = self.Gearind.GetLabel()
        if gr == "N":
            var = 0
        else:
            var = int(gr)        
        self.gauge_1.SetValue(var)
        evt.Skip()



class MyApp(wx.App):
    def OnInit(self): 
        self.Test = MyFrame(None)
        self.SetTopWindow(self.Test)
        self.Test.Show()
        return True



if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()
 

введите описание изображения здесьвведите описание изображения здесь