Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.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
wxpython中多帧的代码布局指南_Python_Wxpython - Fatal编程技术网

wxpython中多帧的代码布局指南

wxpython中多帧的代码布局指南,python,wxpython,Python,Wxpython,编辑~现在使用代码 我不熟悉编码,并且很难将变量输入到“frameA”输出到“frameB”。我的问题是,应该如何编写代码的布局,以使输入FrameA的变量在frameB中可用(并在用户输入时刷新-通过单击按钮或取消选择textctrl等) 我使用wxpython,并使用WxBuilder作为指导,但编写实际的UI代码是我自己用来帮助理解下面发生了什么。我已经尝试过class->def->frame UI,这些框架按照我的要求进行组织,按照我的要求显示和隐藏,并且我想要的变量可以在该框架内的条目

编辑~现在使用代码

我不熟悉编码,并且很难将变量输入到“frameA”输出到“frameB”。我的问题是,应该如何编写代码的布局,以使输入FrameA的变量在frameB中可用(并在用户输入时刷新-通过单击按钮或取消选择textctrl等)

我使用wxpython,并使用WxBuilder作为指导,但编写实际的UI代码是我自己用来帮助理解下面发生了什么。我已经尝试过class->def->frame UI,这些框架按照我的要求进行组织,按照我的要求显示和隐藏,并且我想要的变量可以在该框架内的条目/按钮点击等操作中打印,但是无法从该框架外访问,即使我返回了所需的变量

在本例中,我希望采用frameA的textctrl中编写的内容,并将其保存为可访问(并更新)到其他类的变量,在本例中为FrameB

导入wx
var=“这应该更改为FrameA中键入的任何内容”
类FrameA(wx.Frame):
定义初始化(自身,父级):
wx.Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux.id\uany,title=wx.EmptyString,pos=(0,0),size=wx.size(500300),style=wx.DEFAULT\uframe\uuuuuu
bSizer1=wx.BoxSizer(wx.HORIZONTAL)
self.INPUT=wx.TextCtrl(self,wx.ID_ANY,wx.EmptyString,wx.DefaultPosition,wx.DefaultSize,0)
bSizer1.Add(self.INPUT,1,wx.ALIGN_CENTER_VERTICAL | wx.ALL,5)
自我设置器(bSizer1)
self.INPUT.Bind(wx.EVT_TEXT,self.InputUpdate)
def输入更新(自我,Evt):
var=self.INPUT.GetValue()
#打印(var)
返回值
类FrameB(wx.Frame):
定义初始化(自身,父级):
wx.Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuux.id\uany,title=wx.EmptyString,pos=(100100),size=wx.size(500300),style=wx.DEFAULT\uframe\uuuuuu
bSizer2=wx.BoxSizer(wx.HORIZONTAL)
self.OUTPUT=wx.StaticText(self,wx.ID_ANY,var,wx.DefaultPosition,wx.DefaultSize,0)
bSizer2.Add(self.OUTPUT,1,wx.ALIGN_CENTER_VERTICAL | wx.ALL,5)
自我设定器(bSizer2)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
app=wx.app()
frmA=FrameA(无)
frmB=帧B(无)
frmA.Centre()
frmB.中心()
frmA.Show()
frmB.Show()
app.MainLoop()
由于我还是新手,我已经到了可以理解每一行代码的地步,但是更大的组织对我来说仍然是一团糟

我的理解是,处于编辑“var”上方状态的代码只能从frameA中访问,“return var”可能(?)更新“global”var,但不会刷新到frameB中。我错过了什么?我一直在努力避免使用全局变量,因为我听说在早期使用全局变量是一个坏习惯


谢谢,Sundown

如果您希望所有类都可以访问
var
的值,那么在将新值分配给
var
之前,您需要将
global var
行添加到
InputUpdate()
方法中

但是,这将使
var
仅可供此模块中的所有类访问。如果将代码拆分为两个文件,则将有两个模块,
var
将仅在定义它的模块中可访问,除非您还将定义var的模块导入另一个模块中

代码和一些相关注释:

import wx

var = "This Should change to whatever is typed in FrameA"

class FrameA ( wx.Frame ):

    def __init__(self, parent):
        wx.Frame.__init__ (self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=(0,0), size=(500,300), style=wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 
        bSizer1 = wx.BoxSizer(wx.HORIZONTAL)
        self.INPUT = wx.TextCtrl(self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer1.Add(self.INPUT, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        self.SetSizer(bSizer1)
        self.INPUT.Bind(wx.EVT_TEXT, self.InputUpdate)

    def InputUpdate(self, Evt):
        #### You need to add the following line before assigning the new value to
        #### var in order to modify the global var variable and not the local
        #### var variable
        global var

        var = self.INPUT.GetValue()
        #print (var)
        #### The try/except block is placed to avoid having an error if the text
        #### in frameA changes but frameB does not exist anymore. The code inside
        #### the try statement changes the text in frameB in real time.
        try:
            frmB.OUTPUT.SetLabel(var)
        except Exception:
            pass

class FrameB ( wx.Frame ):

    def __init__(self, parent):
        wx.Frame.__init__ (self, parent, id=wx.ID_ANY, title=wx.EmptyString, pos=(100,100), size=(500,300), style=wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL)
        bSizer2 = wx.BoxSizer(wx.VERTICAL)
        self.OUTPUT = wx.StaticText(self, wx.ID_ANY, var, wx.DefaultPosition, wx.DefaultSize, 0)
        bSizer2.Add(self.OUTPUT, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        #### Button to check the value of the global var variable and make sure
        #### that the code in InputUpdate actually changes the value of the global
        #### variable var
        self.button = wx.Button(self, wx.ID_ANY, label='Var Value')
        bSizer2.Add(self.button, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        self.SetSizer(bSizer2)

        self.button.Bind(wx.EVT_BUTTON, self.varValue)

    def varValue(self, event):
        #### Print the value of the global variable var
        print(var)

if __name__ == '__main__':
    app = wx.App()
    frmA = FrameA(None)
    frmB = FrameB(None)
    frmA.Centre()
    frmB.Centre()
    frmA.Show()
    frmB.Show()
app.MainLoop()

欢迎来到StackOverflow。你可以在这里找到一套很好的wxPython。如果您将实际代码添加到问题中,并将问题缩小到某个特定的问题,将更容易为您提供帮助。感谢kbr85,我不敢相信我之前还没有找到这些问题!再次感谢kbr85,非常有用!