ООП на основе графического интерфейса с wxPython - PullRequest
0 голосов
/ 04 октября 2018

Во-первых, спасибо всем.За последние несколько месяцев я сослался на всю помощь и руководство, которые можно найти на этих досках, что помогло мне «лучше понять» питона!

Я все еще учусь ...простыми словами, пожалуйста!

Теперь перейдем к вопросу!

Я хотел бы разработать довольно «тяжелый ООП» графический интерфейс в том смысле, что объекты будут создаваться, наследуясь от классов, которые наследуются отклассы (через композицию НЕ из множественного наследования;))

Я сейчас столкнулся с препятствием - может быть, будет понятнее, если я нарисую свои шаги:

  1. Создание «основного кадра»
  2. Добавить окно сплиттера к этому фрейму
  3. Добавить treectrl в левую часть сплиттера

Теперь вот с чего начинаются проблемы ...

Я хотел бы создать объект (со своей собственной панелью, которая содержит блокнот с различной информацией, относящейся к экземпляру объекта.

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

Это проблема!

Я пытался показать / скрыть ссылку на object.panel, а также попытался использовать функцию замены окна splitterwindow - безрезультатно.

НекоторыеЧто-то из того, что я пробовал, заменяло правую панель, но также показывало оригинальные панели виджетов ...?

Если кто-то может помочь, это будет оценено.

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

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Спасибо за ваш совет.

Когда я читал ваш ответ о событиях treectrl - я подумал, что быстро попытаюсь заменить ReplaceWindow (oldpanel, newpanel), затем спрятать старое и затем показать новое.

Вот и все!В документации wxPython не удалось указать, что для правильного осуществления изменения необходимо скрыть и затем показать соответствующие старые и новые панели после вызова метода replacewindow.Это может быть из-за того, что родителями как старых, так и новых панелей является окно-сплиттер?

В любом случае, следующий код может помочь кому-то еще, кто может наткнуться на эту проблему / пост и показать концепцию того, что я пыталсядостижения.

Спасибо за вашу помощь!

Алекс

import wx

class MyApp(wx.App):

def __init__(self):



    wx.App.__init__(self, redirect=False, filename='test')

    self.f1 = wx.Frame(parent=None, id=-1, title='APP', pos = (100, 100), size=(1000, 700))
    self.split = wx.SplitterWindow(self.f1)     

    self.leftPanel = wx.Panel(parent=self.split)
    self.oldPanel = wx.Panel(parent=self.split)
    self.newPanel = wx.Panel(parent=self.split)     

    self.oldLabel = wx.StaticText(parent=self.oldPanel, label='This is the old panel...', pos=(50, 50))
    self.newLabel = wx.StaticText(parent=self.newPanel, label='This is now the new panel!', pos=(50, 50))




    self.oldBut = wx.Button(parent = self.leftPanel,label='Show Old Panel', pos=(50, 50))
    self.newBut = wx.Button(parent = self.leftPanel, label='Show New Panel', pos=(50, 75))


    self.leftPanel.Bind(wx.EVT_BUTTON, self.showOld, self.oldBut)               
    self.leftPanel.Bind(wx.EVT_BUTTON, self.showNew, self.newBut)


    self.split.SplitVertically(self.leftPanel, self.oldPanel)
    self.split.SetMinimumPaneSize(100)
    self.split.SetSashPosition(300)

    self.f1.Show()
    self.SetTopWindow(self.f1)


def showOld(self, event):
    self.split.ReplaceWindow(self.split.GetWindow2(), self.oldPanel)
    self.newPanel.Hide()
    self.oldPanel.Show()


def showNew(self, event):
    self.split.ReplaceWindow(self.split.GetWindow2(), self.newPanel)    
    self.oldPanel.Hide()
    self.newPanel.Show()


if __name__ == '__main__':  
    app = MyApp()
    app.MainLoop()
0 голосов
/ 04 октября 2018

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

У меня есть редактор XML, который вы можете посмотреть, который можетпомочь вам понять, как это можно сделать:

К сожалению, для полной демонстрации концепции, которая понадобится, потребуется много кода.Вы имеете в виду.

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