Рубрики
Без рубрики

WxPython: Как открыть второе окно / рамку

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Я вижу вопросы, связанные с названием этой статьи. Как открыть второй кадр/окно? Как получить все рамки, чтобы закрыть, когда я закрываю основное приложение? Когда вы впервые изучаете WXPYPHON, эти виды вопросов могут быть трудно найти ответы на то, что вы недостаточно знакомы с рамками или терминологией, чтобы знать, как искать ответы.

Надеюсь, эта статья поможет. Мы узнаем, как открывать несколько кадров и как сделать их все близко. Давайте начнем!

Открытие нескольких кадров

Создание нескольких кадров на самом деле довольно просты. Вам просто нужно создать подкласс wx.frame Для каждого нового кадра, который вы хотите создать. Или если новые рамки могут выглядеть так же, то вам просто нужно мгновенно создавать второй класс. Вам также понадобится подкласс wx.frame для рамки основного приложения. Давайте напишем какой-нибудь код, как я думаю, что сделает вещи более понятными:

import wx


class OtherFrame(wx.Frame):
    """
    Class used for creating frames other than the main one
    """
    
    def __init__(self, title, parent=None):
        wx.Frame.__init__(self, parent=parent, title=title)
        self.Show()


class MyPanel(wx.Panel):
    
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        
        btn = wx.Button(self, label='Create New Frame')
        btn.Bind(wx.EVT_BUTTON, self.on_new_frame)
        self.frame_number = 1
        
    def on_new_frame(self, event):
        title = 'SubFrame {}'.format(self.frame_number)
        frame = OtherFrame(title=title)
        self.frame_number += 1

        
class MainFrame(wx.Frame):
    
    def __init__(self):
        wx.Frame.__init__(self, None, title='Main Frame', size=(800, 600))
        panel = MyPanel(self)
        self.Show()
        

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

Так что здесь мы создаем два класса, которые подкласс wx.frame: Другое влияние и Мэйнфрейм Отказ Intframe – это то, что мы будем использовать для наших дополнительных кадров, а mainframe – это окно нашей главной приложения. Мы также создаем подкласс wx.panel Удерживать кнопку и обработчик событий кнопки. Кнопка будет использоваться для создания дополнительных кадров.

Попробуйте запустить этот код, и вы обнаружите, что он может создать любое количество дополнительных кадров, просто нажав кнопку несколько раз. Однако, если вы попытаетесь закрыть основное приложение одним или несколькими другими кадрами, все еще работающими, вы обнаружите, что приложение будет продолжать работать.

Давайте узнаем, как мы можем изменить этот код, чтобы закрыть все кадры, когда главная рама закрыта.

Закрытие всех кадров

Вы, возможно, уже заметили это, но как класс Mainframe, так и у класса ONLFRAME имеют набор родителей. Класс Mainframe жестко закодирован довольно тонкость для Нет в то время как другой станок имеет его родитель только по умолчанию. Это на самом деле ключ к нашей проблеме. Когда вы устанавливаете родитель WX.Frame ни к ним, он становится его собственным объектом без зависимостей. Так что это не волнует, если бы еще один кадр закрывается или нет. Однако, если мы должны были установить все родителя другого экземпляра, чтобы быть экземпляром мэйнфрейма, то все они будут закрыты, когда мы закрываем основной кадр.

Чтобы сделать это изменение, все, что нам нужно сделать, это изменить on_new_frame Функция к следующему:

def on_new_frame(self, event):
    title = 'SubFrame {}'.format(self.frame_number)
    frame = OtherFrame(title=title, parent=wx.GetTopLevelParent(self))
    self.frame_number += 1

Здесь мы устанавливаем родителя к мэйнфрейму, используя WxPython’s wx.gettopleverarent функция. Еще один способ сделать это, это изменить MyPanel’s __init__ Сохранить ссылку на родительский параметр:

def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    
    btn = wx.Button(self, label='Create New Frame')
    btn.Bind(wx.EVT_BUTTON, self.on_new_frame)
    self.frame_number = 1
    self.parent = parent

def on_new_frame(self, event):
    title = 'SubFrame {}'.format(self.frame_number)
    frame = OtherFrame(title=title, parent=self.parent)
    self.frame_number += 1

В этом случае мы просто используем атрибут экземпляра здесь для настройки нашего родителя. Просто чтобы быть тщательным, хотя я хочу упомянуть друг на друга, мы могли бы установить родитель на экземпляр мэйнфрейма, и это позвонив GetParent () :

def on_new_frame(self, event):
    title = 'SubFrame {}'.format(self.frame_number)
    frame = OtherFrame(title=title, parent=self.GetParent())
    self.frame_number += 1

Здесь мы просто называем метод MyPanel’s GetParent (), чтобы получить родитель группы. Это работает, потому что MyPanel используется только мэйнфреймом. Вещи станут грязными, если бы мы получили этот класс панели с другими рамками, поэтому я лично предпочитаю GetTopeVerParent Метод, потому что это в значительной степени гарантирует, что мы получим правильный виджет.

Обертывание

Работа с несколькими рамками не должно быть сложно. Я надеюсь, что этот учебник показал вам, насколько легко это сделать. Вы можете использовать концепции в этой статье, чтобы также создавать диалоги, поскольку они работают так же, как и рамы, хотя они имеют тенденцию быть модальными. Спасибо за чтение и счастливое кодирование!