Изменение атрибутов в других панелях
Вот код, над которым я работаю:
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. Auinotebook выполнен из панелей Choicebook. Каждая панель Choicebook состоит из 12 переменных textctrl.
Если пользователь изменяет значение на одной панели Choicebook, мне нужно изменить соответствующие значения на других панелях Choicebook.
Значения математически связаны. Я не могу обновить значения других панелей.
Любая помощь по этому поводу будет здорово.
Спасибо, что нашли время, чтобы помочь мне.
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-события (определяемые пользователем), чтобы уведомить вторую вкладку об изменении, но в принципе все они похожи.