Изменение атрибутов в других панелях

Вот код, над которым я работаю:

import wx
import wx.aui
import wx.lib.scrolledpanel
from parse import *
import settings    

parser=parse()

ID_OPEN = 101
ID_SAVE = 102
ID_QUIT = 103

factors = ['Power','Fuel','Pot Water','Bottled Water','Storage Area','Personnel','Grey Water','Black Water','Solid Waste','Food','Material','Cost']

class TabPanel100(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)

        chpanel1=wx.Panel(self,-1)    

        static1 = wx.StaticText(chpanel1,wx.NewId(), "Power:",pos=(10,10))
        self.text1 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[0]),size=(80,-1),pos=(140,10),style = wx.TE_PROCESS_ENTER,name = factors[0])
        static2 = wx.StaticText(chpanel1,wx.NewId(),"Fuel:",pos=(10,35))
        self.text2 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[1]),size=(80,-1),pos=(140,35),style = wx.TE_PROCESS_ENTER,name = factors[1])
        static3 = wx.StaticText(chpanel1,wx.NewId(),"Pot Water:",pos=(10,60))
        self.text3 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[2]),size=(80,-1),pos=(140,60),style = wx.TE_PROCESS_ENTER,name = factors[2])
        static4 = wx.StaticText(chpanel1,wx.NewId(),"Bottled Water:",pos=(10,85))
        self.text4 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[3]),size=(80,-1),pos=(140,85),style = wx.TE_PROCESS_ENTER,name = factors[3])
        static5 = wx.StaticText(chpanel1,wx.NewId(),"Storage Area:",pos=(10,110))
        self.text5 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[4]),size=(80,-1),pos=(140,110),style = wx.TE_PROCESS_ENTER,name = factors[4])
        static6 = wx.StaticText(chpanel1,wx.NewId(),"Personnel:",pos=(10,135))
        self.text6 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[5]),size=(80,-1),pos=(140,135),style = wx.TE_PROCESS_ENTER,name = factors[5])
        static7 = wx.StaticText(chpanel1,wx.NewId(),"Grey Water:",pos=(10,160))
        self.text7 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[6]),size=(80,-1),pos=(140,160),style = wx.TE_PROCESS_ENTER,name = factors[6])
        static8 = wx.StaticText(chpanel1,wx.NewId(),"Black Water:",pos=(10,185))
        self.text8 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[7]),size=(80,-1),pos=(140,185),style = wx.TE_PROCESS_ENTER,name = factors[7])
        static9 = wx.StaticText(chpanel1,wx.NewId(),"Solid Waste:",pos=(10,210))
        self.text9 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[8]),size=(80,-1),pos=(140,210),style = wx.TE_PROCESS_ENTER,name = factors[8])
        static10 = wx.StaticText(chpanel1,wx.NewId(),"Food:",pos=(10,235))
        self.text10 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.values[9]),size=(80,-1),pos=(140,235),style = wx.TE_PROCESS_ENTER,name = factors[9])
        static11 = wx.StaticText(chpanel1,wx.NewId(),"Materials:",pos=(10,260))
        self.text11 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.values[10]),size=(80,-1),pos=(140,260),style = wx.TE_PROCESS_ENTER,name = factors[10])
        static12 = wx.StaticText(chpanel1,wx.NewId(),"Cost($k):",pos=(10,285))
        self.text12 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.values[11]),size=(80,-1),pos=(140,285),style = wx.TE_PROCESS_ENTER,name = factors[11])
        inputs = [self.text1,self.text2,self.text3,self.text4,self.text5,self.text5,self.text6,self.text7,self.text8,self.text9,self.text10,self.text11,self.text12]

        for item in inputs:
            item.Bind(wx.EVT_TEXT_ENTER, self.UpdateEstValues)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(chpanel1)

        self.SetSizer(sizer)

    def UpdateEstValues(self,event):
        item = event.GetEventObject()
        if float(item.GetValue()) < 0:
            dlg = wx.MessageDialog(self, "Value cannot be negative.",'Error', wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            pass
        else:
            varName = item.GetName()

            if varName == factors[0]:
                parser.values[0] = float(item.GetValue())    

class TabPanel200(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)

        chpanel1=wx.Panel(self,-1)    

        static1 = wx.StaticText(chpanel1,wx.NewId(),"Power:",pos=(10,10))
        text1 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[0]),size=(80,-1),pos=(140,10))
        static2 = wx.StaticText(chpanel1,wx.NewId(),"Fuel:",pos=(10,35))
        text2 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[1]),size=(80,-1),pos=(140,35))
        static3 = wx.StaticText(chpanel1,wx.NewId(),"Pot Water:",pos=(10,60))
        text3 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[2]),size=(80,-1),pos=(140,60))
        static4 = wx.StaticText(chpanel1,wx.NewId(),"Bottled Water:",pos=(10,85))
        text4 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[3]),size=(80,-1),pos=(140,85))
        static5 = wx.StaticText(chpanel1,wx.NewId(),"Storage Area:",pos=(10,110))
        text5 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[4]),size=(80,-1),pos=(140,110))
        static6 = wx.StaticText(chpanel1,wx.NewId(),"Personnel:",pos=(10,135))
        text6 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[5]),size=(80,-1),pos=(140,135))
        static7 = wx.StaticText(chpanel1,wx.NewId(),"Grey Water:",pos=(10,160))
        text7 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[6]),size=(80,-1),pos=(140,160))
        static8 = wx.StaticText(chpanel1,wx.NewId(),"Black Water:",pos=(10,185))
        text8 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[7]),size=(80,-1),pos=(140,185))
        static9 = wx.StaticText(chpanel1,wx.NewId(),"Solid Waste:",pos=(10,210))
        text9 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[8]),size=(80,-1),pos=(140,210))
        static10 = wx.StaticText(chpanel1,wx.NewId(),"Food:",pos=(10,235))
        text10 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[9]),size=(80,-1),pos=(140,235))
        static11 = wx.StaticText(chpanel1,wx.NewId(),"Materials:",pos=(10,260))
        text11 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[10]),size=(80,-1),pos=(140,260))
        static12 = wx.StaticText(chpanel1,wx.NewId(),"Cost($k):",pos=(10,285))
        text12 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.totals[11]),size=(80,-1),pos=(140,285))    

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(chpanel1)

        self.SetSizer(sizer)    

class TabPanel300(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)

        chpanel1=wx.Panel(self,-1)    

        static1 = wx.StaticText(chpanel1,wx.NewId(),"Power:",pos=(10,10))
        self.text1 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[0]),size=(80,-1),pos=(140,10))
        static2 = wx.StaticText(chpanel1,wx.NewId(),"Fuel:",pos=(10,35))
        text2 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[1]),size=(80,-1),pos=(140,35))
        static3 = wx.StaticText(chpanel1,wx.NewId(),"Pot Water:",pos=(10,60))
        text3 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[2]),size=(80,-1),pos=(140,60))
        static4 = wx.StaticText(chpanel1,wx.NewId(),"Bottled Water:",pos=(10,85))
        text4 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[3]),size=(80,-1),pos=(140,85))
        static5 = wx.StaticText(chpanel1,wx.NewId(),"Storage Area:",pos=(10,110))
        text5 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[4]),size=(80,-1),pos=(140,110))
        static6 = wx.StaticText(chpanel1,wx.NewId(),"Personnel:",pos=(10,135))
        text6 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[5]),size=(80,-1),pos=(140,135))
        static7 = wx.StaticText(chpanel1,wx.NewId(),"Grey Water:",pos=(10,160))
        text7 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[6]),size=(80,-1),pos=(140,160))
        static8 = wx.StaticText(chpanel1,wx.NewId(),"Black Water:",pos=(10,185))
        text8 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[7]),size=(80,-1),pos=(140,185))
        static9 = wx.StaticText(chpanel1,wx.NewId(),"Solid Waste:",pos=(10,210))
        text9 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[8]),size=(80,-1),pos=(140,210))
        static10 = wx.StaticText(chpanel1,wx.NewId(),"Food:",pos=(10,235))
        text10 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[9]),size=(80,-1),pos=(140,235))
        static11 = wx.StaticText(chpanel1,wx.NewId(),"Materials:",pos=(10,260))
        text11 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[10]),size=(80,-1),pos=(140,260))
        static12 = wx.StaticText(chpanel1,wx.NewId(),"Cost($k):",pos=(10,285))
        text12 = wx.TextCtrl(chpanel1,wx.NewId(),str(parser.factors[11]),size=(80,-1),pos=(140,285))

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(chpanel1)

        self.SetSizer(sizer)

class TabPanel1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)

        sizer = wx.BoxSizer(wx.VERTICAL)    
        self.SetSizer(sizer)

class TabPanel2(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent=parent, id=wx.ID_ANY)
        sizer = wx.BoxSizer(wx.VERTICAL)

        chpanel2=wx.Panel(self,-1)    

        static11 = wx.StaticText(chpanel2,wx.NewId(),"Power:",pos=(10,10))
        text11 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresources1),size=(80,-1),pos=(140,10))
        static21 = wx.StaticText(chpanel2,wx.NewId(),"Fuel:",pos=(10,35))
        text21 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces2),size=(80,-1),pos=(140,35))
        static31 = wx.StaticText(chpanel2,wx.NewId(),"Pot Water:",pos=(10,60))
        text31 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces3),size=(80,-1),pos=(140,60))
        static41 = wx.StaticText(chpanel2,wx.NewId(),"Bottled Water:",pos=(10,85))
        text41 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces4),size=(80,-1),pos=(140,85))
        static51 = wx.StaticText(chpanel2,wx.NewId(),"Storage Area:",pos=(10,110))
        text51 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces5),size=(80,-1),pos=(140,110))
        static61 = wx.StaticText(chpanel2,wx.NewId(),"Personnel:",pos=(10,135))
        text61 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces6),size=(80,-1),pos=(140,135))
        static71 = wx.StaticText(chpanel2,wx.NewId(),"Grey Water:",pos=(10,160))
        text71 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces7),size=(80,-1),pos=(140,160))
        static81 = wx.StaticText(chpanel2,wx.NewId(),"Black Water:",pos=(10,185))
        text81 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces8),size=(80,-1),pos=(140,185))
        static91 = wx.StaticText(chpanel2,wx.NewId(),"Solid Waste:",pos=(10,210))
        text91 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces9),size=(80,-1),pos=(140,210))
        static101 = wx.StaticText(chpanel2,wx.NewId(),"Food:",pos=(10,235))
        text101 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces10),size=(80,-1),pos=(140,235))
        static111 = wx.StaticText(chpanel2,wx.NewId(),"Materials:",pos=(10,260))
        text111 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces11),size=(80,-1),pos=(140,260))
        static121 = wx.StaticText(chpanel2,wx.NewId(),"Cost($k):",pos=(10,285))
        text121 = wx.TextCtrl(chpanel2,wx.NewId(),str(parser.totalresouces12),size=(80,-1),pos=(140,285))

        sizer = wx.BoxSizer(wx.VERTICAL)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(chpanel2)

        self.SetSizer(sizer)    

class ChoicebookDemo1(wx.Choicebook):

    def __init__(self, parent):
        wx.Choicebook.__init__(self, parent, wx.ID_ANY)

           # Create the first tab and add it to the notebook
        tabOne = TabPanel1(self)
        tabOne.SetBackgroundColour("Gray")
        self.AddPage(tabOne, "Select facility")

           # Create and add the second tab
        tabTwo = TabPanel100(self)
        self.AddPage(tabTwo, "Electrical Distribution")

           # Create and add the third tab
        self.AddPage(TabPanel100(self), "Electrical Generation")
        self.AddPage(TabPanel100(self), "Natural gas Distribution")
        self.AddPage(TabPanel100(self), "Water distribution")


        self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged)

    def OnPageChanged(self, event):
         old = event.GetOldSelection()
         new = event.GetSelection()
         page=self.GetPageText(event.GetSelection())
        # sel = self.GetSelection()
         print(page)
         print 'OnPageChanged,  old:%d, new:%d\n' % (old, new)
         event.Skip()

class ChoicebookDemo2(wx.Choicebook):

    def __init__(self, parent):
        wx.Choicebook.__init__(self, parent, wx.ID_ANY)

           # Create the first tab and add it to the notebook
        tabOne = TabPanel1(self)
        tabOne.SetBackgroundColour("Gray")
        self.AddPage(tabOne, "Select facility")

           # Create and add the second tab
        tabTwo = TabPanel200(self)
        self.AddPage(tabTwo, "Values")

           # Create and add the third tab

        self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged)

    def OnPageChanged(self, event):
         old = event.GetOldSelection()
         new = event.GetSelection()
        # sel = self.GetSelection()
         print 'OnPageChanged,  old:%d, new:%d\n' % (old, new)
         event.Skip()    

class ChoicebookDemo3(wx.Choicebook):

    def __init__(self, parent):
        wx.Choicebook.__init__(self, parent, wx.ID_ANY)

           # Create the first tab and add it to the notebook
        tabOne = TabPanel1(self)
        tabOne.SetBackgroundColour("Gray")
        self.AddPage(tabOne, "Select facility")

           # Create and add the second tab
        tabTwo = TabPanel300(self)
        self.AddPage(tabTwo, "Electrical Distribution")

           # Create and add the third tab
        self.AddPage(TabPanel300(self), "Electrical Generation")
        self.AddPage(TabPanel300(self), "Natural gas Distribution")
        self.AddPage(TabPanel300(self), "Water distribution")

        self.Bind(wx.EVT_CHOICEBOOK_PAGE_CHANGED, self.OnPageChanged)

    def OnPageChanged(self, event):
         old = event.GetOldSelection()
         new = event.GetSelection()
        # sel = self.GetSelection()
         print 'OnPageChanged,  old:%d, new:%d\n' % (old, new)
         event.Skip()

class Panel(wx.Panel):
    def __init__(self,parent):

        wx.Panel.__init__(self,parent=parent)

        nb1=wx.aui.AuiNotebook(self)

        page1=[(TabPanel2(nb1),"Overall Resources"),(ChoicebookDemo1(nb1),"factors"),(ChoicebookDemo2(nb1),"values"),(ChoicebookDemo3(nb1),"totals")]

        for page1, label1 in page1:
            nb1.AddPage(page1,label1)

        sizer=wx.BoxSizer(wx.VERTICAL)
        sizer.Add(nb1,1,wx.EXPAND)
        self.SetSizer(sizer)

class MyFrame(wx.Frame):

    def __init__(self, parent, id=-1, title='wx.aui Test',
                 pos=wx.DefaultPosition, size=(1000, 500),
                 style=wx.DEFAULT_FRAME_STYLE):
        wx.Frame.__init__(self, parent, id, title, pos, size, style)

        menubar =wx.MenuBar()
        file = wx.Menu()
        edit = wx.Menu()
        help = wx.Menu()
        tools = wx.Menu()
        pr = wx.Menu()
        file.Append(ID_OPEN, 'Open...', 'Load a specific dataset')
        file.Append(ID_SAVE, 'Save As...', 'Save current dataset')
        file.Append(ID_QUIT, 'Quit', 'Quit application')    

        menubar.Append(file,'&File')
        menubar.Append(edit,'&Edit')
        menubar.Append(help,'&Help')
        menubar.Append(tools,'&Tools')
        menubar.Append(pr,'&PR')

        self.SetMenuBar(menubar)

        self._mgr = wx.aui.AuiManager(self)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        toppanel=wx.Panel(self)    
        text3 = Panel(self)

        sizer=wx.BoxSizer(wx.VERTICAL)
        sizer.Add(text3,0,wx.ALL,border=10)

        toppanel.SetSizer(sizer)    

        # add the panes to the manager
        self._mgr.AddPane(text3, wx.CENTER,'Restoration data')

        # tell the manager to 'commit' all the changes just made
        self._mgr.Update()

        self.Bind(wx.EVT_CLOSE, self.OnClose)    

    def OnQuit(self,event):
        self.Close()    

    def OnClose(self, event):
        # deinitialize the frame manager
        self._mgr.UnInit()
        # delete the frame
        self.Destroy()    

app = wx.App()
frame = MyFrame(None)
frame.Show()
app.MainLoop()

Я новичок, начал работать над wxpython для проекта класса.

В мэйнфрейме есть автоноутбук. Auinotebook сделан из панелей Choicebook. Каждая панель Choicebook состоит из панели 12 переменных textctrl.

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

Значения математически связаны. Я не могу обновить значения других панелей.

Любая помощь по этому поводу была бы здорово.

Спасибо, что нашли время, чтобы помочь мне.


person Havish Varma    schedule 30.10.2016    source источник
comment
Ну, вы должны помнить, что люди ленивы. Если вы публикуете такой большой кусок кода, никто его не прочитает, и вы ограничиваете свои шансы получить ответ. Я думаю, если бы вы разместили только одну записную книжку с 2 вкладками, по 2 текстовых Ctrl в каждой, у вас был бы ответ несколько дней назад :-)   -  person Petr Blahos    schedule 02.11.2016


Ответы (1)


Вы правильно начали с привязки EVT_TEXT_ENTER к UpdateEstValues. Там вы получаете введенное значение, и вам остается только перенести это значение во вторую вкладку, верно? Вы также, кажется, используете синтаксический анализатор как «модель», которая сохраняет правильные текущие значения? Таким образом, в UpdateEstValues ​​вы обновляете модель (парсер), которую вы, вероятно, можете заставить работать самостоятельно, вам нужно только указать второй вкладке обновить ее значения.

Структурно есть много способов, как это сделать, но все сводится к какому-то запуску события, которое сообщает второй вкладке обновиться. Таким образом, самая основная идея состоит в том, чтобы иметь функцию parser.fire и parser.add_listener. Вторая вкладка будет иметь функцию обновления

def update(self, parameter_name):
    self.text_edits[parameter_name].SetValue(parser.get_value("parameter_name"))

В вашем основном фрейме после создания вкладок вы должны сделать:

parser.add_listener(second_tab.update)

и в ваших UpdateEstValues ​​​​вы бы сделали:

parser.fire(parameter_name)

Нам не хватает:

def add_listener(self, listener):
    self.listeners.append(listener)

def fire(self, parameter_name):
    for i in self.listeners:
        i(parameter_name)

что, конечно, своего рода минимальная демонстрация подхода. Вы можете искать пакет pubsub, вы можете использовать события wx (определенные пользователем), чтобы уведомить вторую вкладку об изменении, но в принципе они все похожи.

person Petr Blahos    schedule 02.11.2016