wxpython中多帧的代码布局指南
编辑~现在使用代码 我不熟悉编码,并且很难将变量输入到“frameA”输出到“frameB”。我的问题是,应该如何编写代码的布局,以使输入FrameA的变量在frameB中可用(并在用户输入时刷新-通过单击按钮或取消选择textctrl等) 我使用wxpython,并使用WxBuilder作为指导,但编写实际的UI代码是我自己用来帮助理解下面发生了什么。我已经尝试过class->def->frame UI,这些框架按照我的要求进行组织,按照我的要求显示和隐藏,并且我想要的变量可以在该框架内的条目/按钮点击等操作中打印,但是无法从该框架外访问,即使我返回了所需的变量 在本例中,我希望采用frameA的textctrl中编写的内容,并将其保存为可访问(并更新)到其他类的变量,在本例中为FrameBwxpython中多帧的代码布局指南,python,wxpython,Python,Wxpython,编辑~现在使用代码 我不熟悉编码,并且很难将变量输入到“frameA”输出到“frameB”。我的问题是,应该如何编写代码的布局,以使输入FrameA的变量在frameB中可用(并在用户输入时刷新-通过单击按钮或取消选择textctrl等) 我使用wxpython,并使用WxBuilder作为指导,但编写实际的UI代码是我自己用来帮助理解下面发生了什么。我已经尝试过class->def->frame UI,这些框架按照我的要求进行组织,按照我的要求显示和隐藏,并且我想要的变量可以在该框架内的条目
导入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,非常有用!