Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何在wxpython中重建变量函数中的面板?_Variables_Wxpython_Rewrite_Panels_Rebuild - Fatal编程技术网

Variables 如何在wxpython中重建变量函数中的面板?

Variables 如何在wxpython中重建变量函数中的面板?,variables,wxpython,rewrite,panels,rebuild,Variables,Wxpython,Rewrite,Panels,Rebuild,我找了很多来做这件事,但我试过的工作却一无所获。现在,作为最后一次尝试,我正在尝试使用pubsub,但我没有得到任何有价值的东西,这就是为什么我现在请求帮助:。这是我能做的最起码的一件事:我想要的例子。PanelB在列表框中获取信息,当选择某个项目时,PanelA应该根据他进行更改。 先谢谢你 from wx.lib.pubsub import Publisher import wx global name name = 'none, please select an item' clas

我找了很多来做这件事,但我试过的工作却一无所获。现在,作为最后一次尝试,我正在尝试使用pubsub,但我没有得到任何有价值的东西,这就是为什么我现在请求帮助:。这是我能做的最起码的一件事:我想要的例子。PanelB在列表框中获取信息,当选择某个项目时,PanelA应该根据他进行更改。 先谢谢你

from wx.lib.pubsub import Publisher
import wx

global name
name  = 'none, please select an item'

class PanelA(wx.Panel):
   def __init__(self, parent, name):
       wx.Panel.__init__(self, parent)
       self.hbox = wx.BoxSizer(wx.HORIZONTAL)
       self.vbox = wx.BoxSizer(wx.VERTICAL)
       str = name
       txt = wx.StaticText(self, -1, "You have selected " + str, (20, 100))
       self.hbox.Add(txt, 1, wx.EXPAND | wx.ALL, 20)

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

       self.hbox = wx.BoxSizer(wx.HORIZONTAL)
       self.vbox = wx.BoxSizer(wx.VERTICAL)

       self.listbox = wx.ListBox(self, -1)
       self.hbox.Add(self.listbox, 1, wx.EXPAND | wx.ALL, 20)

       self.btnPanel = wx.Panel(self, -1)      
       self.new = wx.Button(self.btnPanel,label='Add', size=(90, 30))
       self.new.Bind(wx.EVT_BUTTON, self.NewItem)

       self.vbox.Add((-1, 20))
       self.vbox.Add(self.new)

       self.btnPanel.SetSizer(self.vbox)
       self.hbox.Add(self.btnPanel, 0.6, wx.EXPAND | wx.RIGHT, 20)
       self.SetSizer(self.hbox)

       self.Bind(wx.EVT_LISTBOX, self.onSelect)

    def onSelect(self, event):
       name_selected = self.listbox.GetStringSelection()
       Publisher().sendMessage(("ListBox"), name_selected)

def NewItem(self, event):
       text = wx.GetTextFromUser('Nombre', 'Programa a salvar')
       if text != '':
           self.listbox.Append(text)

class MainFrame(wx.Frame):
   def __init__(self, parent, id, title, *args, **kw):

       wx.Frame.__init__(self, parent, id, title, size = (800,300))

       self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_3D)

       self.lc1 = PanelB(self.splitter)
       Publisher().subscribe(self.OnSelect, ("ListBox"))
       self.lc2 = PanelA(self.splitter, name)
       self.splitter.SplitVertically(self.lc1, self.lc2)

       sizer = wx.BoxSizer(wx.HORIZONTAL)
       sizer.Add(self.splitter, 1, wx.EXPAND)
       self.SetSizer(sizer)

       self.Centre()
       self.Show(True)

   def OnSelect(self, name_selected):
       name = name_selected
       #I stucked here

if __name__ == "__main__":
   app = wx.App()
   frame = MainFrame(None,-1,'Mi aplicacion')
   app.MainLoop()
这不是一个很好的解决方案,基本上你可以销毁PanelA,然后再次调用该面板,可能是这样的:

def OnSelect(self, name_selected):
    self.lc2.Destroy()
    self.lc2 = PanelA(self.splitter, name_selected.data)
希望这能有所帮助

import wx
from wx.lib.pubsub import Publisher

class PanelA(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        name = "none, please select an item"
        self.txt = wx.StaticText(self, -1, "You have selected " + name,
                                 (50, 100))
        self.hbox.Add(self.txt, 1, wx.EXPAND|wx.ALL, 30)

    def changeName(self, name):
        self.hbox.Hide(self.txt)
        self.hbox.Remove(self.txt)
        self.txt = wx.StaticText(self, -1, "You have selected " + name, (50, 100))
        self.hbox.Add(self.txt, 1, wx.EXPAND|wx.ALL, 30)


class PanelB(wx.Panel):

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

        self.hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.vbox = wx.BoxSizer(wx.VERTICAL)

        self.listbox = wx.ListBox(self, -1)
        self.hbox.Add(self.listbox, 1, wx.EXPAND|wx.ALL, 20)

        self.btnPanel = wx.Panel(self, -1)      
        self.new = wx.Button(self.btnPanel,label='Add', size=(90, 30))
        self.new.Bind(wx.EVT_BUTTON, self.NewItem)

        self.vbox.Add((-1, 20))
        self.vbox.Add(self.new)

        self.btnPanel.SetSizer(self.vbox)
        self.hbox.Add(self.btnPanel, 0.6, wx.EXPAND|wx.RIGHT, 20)
        self.SetSizer(self.hbox)

        self.Bind(wx.EVT_LISTBOX, self.onSelect)

    def onSelect(self, event):
        name_selected = self.listbox.GetStringSelection()
        Publisher().sendMessage("ListBox", name_selected)

    def NewItem(self, event):
        text = wx.GetTextFromUser('Nombre', 'Programa a salvar')
        if text != '':
            self.listbox.Append(text)


class MainFrame(wx.Frame):

   def __init__(self, parent, id, title, *args, **kw):

       wx.Frame.__init__(self, parent, id, title, size = (800,300))
       self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_3D)
       Publisher().subscribe(self.OnSelect, "ListBox")

       self.lc1 = PanelB(self.splitter)
       self.lc2 = PanelA(self.splitter)
       self.splitter.SplitVertically(self.lc1, self.lc2)

       self.sizer = wx.BoxSizer(wx.HORIZONTAL)
       self.sizer.Add(self.splitter, 1, wx.EXPAND)
       self.SetSizer(self.sizer)
       self.Layout()

       self.Centre()

   def OnSelect(self, name_selected):
       name = name_selected
       self.lc2.changeName(name.data)


if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MainFrame(None,-1,'Mi aplicacion')
    frame.Show()
    app.MainLoop()
更新08/24/2012:添加了一些代码

好吧,我们不应该破坏这个小组。我正在使用你的代码,并对其进行了一些修改。我删除了全局变量名,并将changeNamename函数添加到PanelA中,以便在调用MainFrame.onSelect时,它将调用changeName。这并不漂亮,但希望这能有所帮助

import wx
from wx.lib.pubsub import Publisher

class PanelA(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        self.hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.vbox = wx.BoxSizer(wx.VERTICAL)
        name = "none, please select an item"
        self.txt = wx.StaticText(self, -1, "You have selected " + name,
                                 (50, 100))
        self.hbox.Add(self.txt, 1, wx.EXPAND|wx.ALL, 30)

    def changeName(self, name):
        self.hbox.Hide(self.txt)
        self.hbox.Remove(self.txt)
        self.txt = wx.StaticText(self, -1, "You have selected " + name, (50, 100))
        self.hbox.Add(self.txt, 1, wx.EXPAND|wx.ALL, 30)


class PanelB(wx.Panel):

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

        self.hbox = wx.BoxSizer(wx.HORIZONTAL)
        self.vbox = wx.BoxSizer(wx.VERTICAL)

        self.listbox = wx.ListBox(self, -1)
        self.hbox.Add(self.listbox, 1, wx.EXPAND|wx.ALL, 20)

        self.btnPanel = wx.Panel(self, -1)      
        self.new = wx.Button(self.btnPanel,label='Add', size=(90, 30))
        self.new.Bind(wx.EVT_BUTTON, self.NewItem)

        self.vbox.Add((-1, 20))
        self.vbox.Add(self.new)

        self.btnPanel.SetSizer(self.vbox)
        self.hbox.Add(self.btnPanel, 0.6, wx.EXPAND|wx.RIGHT, 20)
        self.SetSizer(self.hbox)

        self.Bind(wx.EVT_LISTBOX, self.onSelect)

    def onSelect(self, event):
        name_selected = self.listbox.GetStringSelection()
        Publisher().sendMessage("ListBox", name_selected)

    def NewItem(self, event):
        text = wx.GetTextFromUser('Nombre', 'Programa a salvar')
        if text != '':
            self.listbox.Append(text)


class MainFrame(wx.Frame):

   def __init__(self, parent, id, title, *args, **kw):

       wx.Frame.__init__(self, parent, id, title, size = (800,300))
       self.splitter = wx.SplitterWindow(self, -1, style=wx.SP_3D)
       Publisher().subscribe(self.OnSelect, "ListBox")

       self.lc1 = PanelB(self.splitter)
       self.lc2 = PanelA(self.splitter)
       self.splitter.SplitVertically(self.lc1, self.lc2)

       self.sizer = wx.BoxSizer(wx.HORIZONTAL)
       self.sizer.Add(self.splitter, 1, wx.EXPAND)
       self.SetSizer(self.sizer)
       self.Layout()

       self.Centre()

   def OnSelect(self, name_selected):
       name = name_selected
       self.lc2.changeName(name.data)


if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MainFrame(None,-1,'Mi aplicacion')
    frame.Show()
    app.MainLoop()

现在我想让它能做这项工作,以后我会努力做得更好:。这不起作用,我以前在程序中尝试过,现在在这个最小的示例中,它破坏了面板,但我无法重建它。@AsVHEn我已经更新了我的答案,对代码进行了一些修改,很有效。非常感谢您,如果我能在我的程序中做到这一点,我会尝试一下:很高兴能帮上忙,只要您的主框架上有您的面板实例,您就可以从PanelA调用任何函数。使用pubsub与大型机对话是件好事。它将PanelB封装起来