Добавьте переменную, чтобы показать любой текст в рамке wx python - PullRequest
0 голосов
/ 07 апреля 2020

Итак, я учу python в школе, и как часть моего текущего проекта я хочу иметь возможность делать маленькие «всплывающие окна» на экране. Я решил сделать это с wx python, но столкнулся с проблемой. Сейчас я не могу найти способ добавить переменную, чтобы я мог печатать все, что захочу. Я попытался добавить дополнительную переменную как к классу, так и к функции init , но получил ошибку для обоих. Я не привык к занятиям или как они работают, и я был бы очень признателен за помощь. Вот код, который я использую:

import wx

class HelloFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(HelloFrame, self).__init__(*args, **kw)

        pnl = wx.Panel(self)
        st = wx.StaticText(pnl, label = "Betting")
        font = st.GetFont()
        font.PointSize += 10
        font = font.Bold()
        st.SetFont(font)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(st, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 25))
        pnl.SetSizer(sizer)

        self.makeMenuBar()
        self.CreateStatusBar()
        self.SetStatusText("Welcome to wxPython!")

    def makeMenuBar(self):
        fileMenu = wx.Menu()
        helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H",
        "Help string shown in status bar for this menu item")
        fileMenu.AppendSeparator()
        exitItem = fileMenu.Append(wx.ID_EXIT)

        helpMenu = wx.Menu()
        aboutItem = helpMenu.Append(wx.ID_ABOUT)

        menuBar = wx.MenuBar()
        menuBar.Append(fileMenu, "&file")
        menuBar.Append(helpMenu, "&help")

        self.SetMenuBar(menuBar)

        self.Bind(wx.EVT_MENU, self.OnHello, helloItem)
        self.Bind(wx.EVT_MENU, self.OnExit, exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)

    def OnExit(self, event):
        self.Close(True)

    def OnHello(self, event):
        wx.MessageBox("Hello again from wxPython")

    def OnAbout(self, event):
        wx.MessageBox("This is a wxPython Hello World Sample", "About Hello World 2", wx.OK|wx.ICON_INFORMATION)

if __name__ == '__main__':
    x = number()
    app = wx.App()
    frm = HelloFrame(None, title='Betting predictions')
    frm.Show()
    app.MainLoop()

Теперь я хочу иметь возможность вводить что-либо в качестве метки в st = wx.StaticText(pnl, label = "Betting") вместо просто «Ставки» и показывать любой текст, который я хочу, но для жизнь я не могу понять это. Это относительно небольшая часть моего проекта, так как я закончила и у меня есть дополнительное время, но я бы очень хотела, чтобы он заработал.

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

@ Переменная instance Петра Блаоса введена в действие.
Обратите внимание, что self.st.SetLabel() применяется до MessageBox, иначе метка не будет обновлена, пока сообщение не будет отменено. self.mycount также объявляется как переменная экземпляра.

import wx

class HelloFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(HelloFrame, self).__init__(*args, **kw)

        pnl = wx.Panel(self)
        self.st = wx.StaticText(pnl, label = "Betting")
        font = self.st.GetFont()
        font.PointSize += 10
        font = font.Bold()
        self.st.SetFont(font)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.st, wx.SizerFlags().Border(wx.TOP|wx.LEFT, 25))
        pnl.SetSizer(sizer)

        self.makeMenuBar()
        self.CreateStatusBar()
        self.SetStatusText("Welcome to wxPython!")
        self.mycount = 0
    # Show Frame and initially call OnHello (use None to compensate for a lack of event)
        self.Show()
        self.OnHello(None)

    def makeMenuBar(self):
        fileMenu = wx.Menu()
        helloItem = fileMenu.Append(-1, "&Hello...\tCtrl-H",
        "Help string shown in status bar for this menu item")
        fileMenu.AppendSeparator()
        exitItem = fileMenu.Append(wx.ID_EXIT)

        helpMenu = wx.Menu()
        aboutItem = helpMenu.Append(wx.ID_ABOUT)

        menuBar = wx.MenuBar()
        menuBar.Append(fileMenu, "&file")
        menuBar.Append(helpMenu, "&help")

        self.SetMenuBar(menuBar)

        self.Bind(wx.EVT_MENU, self.OnHello, helloItem)
        self.Bind(wx.EVT_MENU, self.OnExit, exitItem)
        self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)

    def OnExit(self, event):
        self.Close(True)

    def OnHello(self, event):
        self.mycount += 1
        mystring = "Betting Display No: " + str(self.mycount)
        self.st.SetLabel(mystring)
        wx.MessageBox("Hello again from wxPython")

    def OnAbout(self, event):
        wx.MessageBox("This is a wxPython Hello World Sample", "About Hello World 2", wx.OK|wx.ICON_INFORMATION)

if __name__ == '__main__':
    app = wx.App()
    frm = HelloFrame(None, title='Betting predictions')
    #frm.Show()
    app.MainLoop()

enter image description here

Примечание: вы всегда можете создать self.message, который может быть установлен вне функции и все же используется в нем. Это проще, чем пытаться использовать лямбда-функцию.

1 голос
/ 08 апреля 2020

Вы можете изменить метку, вызвав функцию-член SetLabel для текста c. Теперь вы создаете st в качестве локальной переменной функции init . Вам нужно сделать его переменной экземпляра следующим образом:

class HelloFrame(wx.Frame):
    def __init__(self, *args, **kw):
        super(HelloFrame, self).__init__(*args, **kw)

        pnl = wx.Panel(self)
        self.st = wx.StaticText(pnl, label = "Betting")
        [...]
        # then everywhere you use it, use self.st to access it like this:
        self.st.SetFont(font)

И если вы хотите изменить метку, например, после выбора пункта меню:

def OnHello(self, event):
    wx.MessageBox("Hello again from wxPython")
    self.st.SetLabel("Changed label")

Или если вы хотите чтобы задать текст при построении окна, вы можете передать параметр в функцию (конструктор):

class HelloFrame(wx.Frame):
    def __init__(self, label_title, frame_title):
        super(HelloFrame, self).__init__(title=frame_title)

        pnl = wx.Panel(self)
        self.st = wx.StaticText(pnl, label = label_title)
        [...]

if __name__ == '__main__':
    t = "Some text"
    app = wx.App()
    frm = HelloFrame(None, t, frame_title='Betting predictions')
    frm.Show()
    app.MainLoop()
...