wxPython как установить положение виджета в строке состояния - PullRequest
0 голосов
/ 12 декабря 2018

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

import wx

class MainFrame(wx.Frame):
    """Constructor"""

    def __init__(self, parent, id):
        wx.Frame.__init__(self, None)


        # self.status_bar = self.CreateStatusBar(3)
        self.status_bar = self.CreateStatusBar(3)

        self.status_bar.SetStatusText("some text", 0)

        self.button1 = wx.Button(self.status_bar, -1, "button 1")
        self.button2 = wx.Button(self.status_bar, -1, "button 2")
        self.status_bar.SetStatusWidths([-1, 200, 200])
        self.button1.SetPosition((self.status_bar.Size[0]-100, 0))
        self.button2.SetPosition((self.status_bar.Size[0]-200, 0))

        self.Refresh()
        self.Show()


if __name__ == "__main__":
    app = wx.App()
    MainFrame(None, -1)
    app.MainLoop()

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

Мне было интересно, есть липростой способ установить положение кнопок внутри строки состояния, как мы устанавливаем текст, используя «self.status_bar.SetStatusText (self.button1, 1)» и «self.status_bar.SetStatusText (self.button2, 2)»

Большое спасибо!

================================================================================

Большое спасибо МайкуОтвет Дрисколла, я выяснил, как это сделать.Я опубликую свое решение следующим образом на тот случай, если оно понадобится.

import wx

class MyStatusBar(wx.StatusBar):
    def __init__(self, parent):
        wx.StatusBar.__init__(self, parent)

        self.SetFieldsCount(3)
        self.SetStatusWidths([-1, 200, 200])
        self.sizeChanged = False
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.Bind(wx.EVT_IDLE, self.OnIdle)

        # Field 0 ... just text
        self.SetStatusText("some text", 0)

        # Field for buttons
        self.button1 = wx.Button(self, 1001, "button 1")
        self.button2 = wx.Button(self, 1002, "button 2")

        # set the initial position of the checkbox
        self.Reposition()

    def OnSize(self, evt):
        evt.Skip()
        self.Reposition()  # for normal size events

        # Set a flag so the idle time handler will also do the repositioning.
        # It is done this way to get around a buglet where GetFieldRect is not
        # accurate during the EVT_SIZE resulting from a frame maximize.
        self.sizeChanged = True


    def OnIdle(self, evt):
        if self.sizeChanged:
            self.Reposition()


    # reposition the buttons
    def Reposition(self):
        rect1 = self.GetFieldRect(1)
        rect1.x += 1
        rect1.y += 1
        self.button1.SetRect(rect1)

        rect2 = self.GetFieldRect(2)
        rect2.x += 1
        rect2.y += 1
        self.button2.SetRect(rect2)

        self.sizeChanged = False


class MainFrame(wx.Frame):
    """Constructor"""

    def __init__(self, parent, id):
        wx.Frame.__init__(self, None)

        self.status_bar = MyStatusBar(self)
        self.SetStatusBar(self.status_bar)

        self.Refresh()
        self.Show()


if __name__ == "__main__":
    app = wx.App()
    MainFrame(None, -1)
    app.MainLoop()

1 Ответ

0 голосов
/ 12 декабря 2018

Самый простой способ - создать подкласс самого wx.StatusBar, добавить кнопки и затем поймать wx.EVT_SIZE.Таким образом вы ловите события изменения размера и можете изменять виджеты по мере необходимости.

В демоверсии wxPython есть пример, где он имеет виджет-флажок со следующим методом:

# reposition the checkbox
def Reposition(self):
    rect = self.GetFieldRect(1)
    rect.x += 1
    rect.y += 1
    self.cb.SetRect(rect)
    self.sizeChanged = False

self.GetFieldRect(1) относится к виджету-флажку.Вы можете использовать что-то подобное для себя, за исключением того, что вам нужно будет отслеживать позиции двух виджетов и соответственно обновлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...