Уведомления

Группа в Telegram: @pythonsu

#1 Май 21, 2016 15:41:48

NAGRIS
Зарегистрирован: 2014-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython:

Здравствуйте!

Пробую писать GUI на wxPython.

import os
import wx
import wx.lib.platebtn as pbtn
class MainFrame(wx.Frame):
    def __init__(self, parent, id=-1, title="", pos=wx.DefaultPosition,
                size=(1000, 800), style=wx.DEFAULT_FRAME_STYLE, name="MainFrame"):
        super(MainFrame, self).__init__(parent, id, title, pos, size, style, name)
        panel = wx.Panel(self, -1) 
        vbox = wx.BoxSizer(wx.VERTICAL)
        self.ToolBarPanel   = ToolBar(panel, -1)
        self.TablePanel     = Table(panel, -1)
        self.StatusBarPanel = StatusBar(panel, -1)
        vbox.Add(self.ToolBarPanel, 0, wx.EXPAND | wx.TOP, 0)
        vbox.Add(self.TablePanel, 1, wx.EXPAND, 0)
        vbox.Add(self.StatusBarPanel, 0, wx.BOTTOM | wx.EXPAND, 0)
        panel.SetSizer(vbox)
...
class ToolBar(wx.Panel):
   
    def __init__(self, parent, ID=-1, pos=wx.DefaultPosition, size=(200, 32)):
        wx.Panel.__init__(self, parent, ID, pos, size)
        self.SetBackgroundColour('#74B4FF')
        # Make a BitmapButton
        bmp = wx.Bitmap("../UGR/icons/main_menu_24.png", wx.BITMAP_TYPE_PNG)
        hbox = wx.BoxSizer(wx.HORIZONTAL)
        style = pbtn.PB_STYLE_SQUARE | pbtn.PB_STYLE_DROPARROW
        bmpbtn4 = pbtn.PlateButton(self, bmp=bmp, style=style)
        bmpbtn4.SetPressColor(wx.Colour(205,205,205))
        bmp_btn_main_menu = wx.BitmapButton(self, bitmap=bmp)
        bmpbtn1 = wx.BitmapButton(self, bitmap=bmp)
        bmpbtn2 = wx.BitmapButton(self, bitmap=bmp)
        bmpbtn3 = wx.BitmapButton(self, bitmap=bmp)
        hbox.Add(bmpbtn4, 0, wx.EXPAND | wx.RIGHT, 0)
        hbox.Add(bmp_btn_main_menu, 0, wx.EXPAND | wx.LEFT, 0)
        hbox.Add(bmpbtn1, 0, wx.EXPAND | wx.LEFT, 0)
        hbox.Add(bmpbtn2, 0, wx.EXPAND | wx.LEFT, 0)
        hbox.Add(bmpbtn3, 0, wx.EXPAND | wx.RIGHT, 0)
        self.SetSizer(hbox)
        self.popupmenu = wx.Menu()
        for text in "Выход".split(','):
            item = self.popupmenu.Append(-1, text)
            self.Bind(wx.EVT_MENU, self.OnPopupItemSelected, item)
        bmp_btn_main_menu.Bind(wx.EVT_CONTEXT_MENU, self.OnShowPopup)
    def OnShowPopup(self, event):
        pos = event.GetPosition()
        pos = self.ScreenToClient(pos)
        x = 24 - int(pos[0])
        y = int(pos[1]) + (24 - int(pos[1]))
        pos = (x, y)
        self.PopupMenu(self.popupmenu, pos)
    def OnPopupItemSelected(self, event):
        item = self.popupmenu.FindItemById(event.GetId())
        text = item.GetText()
        StatusBar.setText(StatusBar.txt)
        wx.MessageBox("You selected item '%s'" % text)
class Table(wx.Panel):
   ...
class StatusBar(wx.Panel):
    def __init__(self, parent, ID=-1, pos=wx.DefaultPosition, size=(200, 25)):
        wx.Panel.__init__(self, parent, ID, pos, size)
        self.SetBackgroundColour('#FFFFFF')
        self.txt = wx.TextCtrl(self, wx.ID_ANY, "")
        self.txt.SetFocus()
        self.txt.AppendText('12556')
    def setText(self):
        self.txt.AppendText('7777')
class MyApp(wx.App):
    def OnInit(self):
        self.frame = MainFrame(None, title="UGR")
        self.SetTopWindow(self.frame) 
        self.frame.Show()
        return True
if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

При нажатии на пункте меню выводится ошибка:

Traceback (most recent call last):
File “…”, line 96, in OnPopupItemSelected
StatusBar.setText(StatusBar.txt)
AttributeError: type object ‘StatusBar’ has no attribute ‘txt’

Почему? Ведь StatusBar имеет атрибут txt.

Офлайн

#2 Май 21, 2016 17:42:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

wxPython:

NAGRIS
StatusBar.setText(StatusBar.txt)
С какого перепугу тип StatusBar будет иметь атрибут текст. Объекты этого типа еще может быть и имеют.



Офлайн

#3 Май 21, 2016 18:39:09

NAGRIS
Зарегистрирован: 2014-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython:

doza_and

Спасибо! за подсказку.

Переписал.

def OnPopupItemSelected(self, event):
        item = self.popupmenu.FindItemById(event.GetId())
        text = item.GetText()
        StatusBar.setText(StatusBar(self), text)
...
class StatusBar(wx.Panel):
    def __init__(self, parent, ID=-1, pos=wx.DefaultPosition, size=(200, 25)):
        wx.Panel.__init__(self, parent, ID, pos, size)
        self.SetBackgroundColour('#FFFFFF')
        self.txt = wx.TextCtrl(self, wx.ID_ANY, "")
        self.txt.SetFocus()
        self.txt.AppendText('12556')
    def setText(self, text):
        self.txt.AppendText(text)

Работает, но создает лишнее текстовое поле.

Как я понимаю это из-за self.

Как сделать, чтобы текст писался в уже созданное поле.

Офлайн

#4 Июнь 16, 2016 10:11:37

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

wxPython:

А, для чего такой замысловатый статусбар?
Вы тренируетесь в передаче данных между классами?
Или изобретаете колесо? Так оно уже есть:
Статусбар



Офлайн

#5 Июнь 16, 2016 12:01:07

NAGRIS
Зарегистрирован: 2014-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython:

Тренировка.
И в будущем возможность писать в статусбаре команды.

Офлайн

#6 Июнь 16, 2016 12:31:54

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

wxPython:

NAGRIS
Как сделать, чтобы текст писался в уже созданное поле.
    def OnPopupItemSelected(self, event):
        item = self.popupmenu.FindItemById(event.GetId())
        text = item.GetText()
        self.GetParent().GetParent().StatusBarPanel.setText(self.GetParent().GetParent().StatusBarPanel.txt)
        wx.MessageBox("You selected item '%s'" % text)



Отредактировано leonid_10 (Июнь 16, 2016 12:38:46)

Офлайн

#7 Июнь 16, 2016 12:37:49

NAGRIS
Зарегистрирован: 2014-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython:

Спасибо!

Офлайн

#8 Июнь 16, 2016 12:40:19

NAGRIS
Зарегистрирован: 2014-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython:

Я не смог тогда обойти эту преграду.

И переписал чтобы все было в одном классе.

Не подскажите какой из двух подходов правильный?

Офлайн

#9 Июнь 16, 2016 14:00:15

leonid_10
От:
Зарегистрирован: 2010-03-28
Сообщения: 197
Репутация: +  3  -
Профиль   Отправить e-mail  

wxPython:

NAGRIS
Не подскажите какой из двух подходов правильный?
Я не специалист в правильности, но предпочитаю писать так, чтобы самому потом можно было разобраться в написанном.
Наверное, первый вариант предпочтительней. Он позволяет вносить изменения в код, касающиеся только нужного класса, оставляя остальной код нетронутым, что в свою очередь может оказаться очень удобным при компоновке виджетов и расширении функционала программы.
Но, возможно, специалисты дадут научно обоснованные рекомендации противоположные моим.



Офлайн

#10 Июнь 16, 2016 14:04:43

NAGRIS
Зарегистрирован: 2014-06-13
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

wxPython:

Спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version