在主 GUI 界面和顶级 GUI 界面之间进行通信
Comunicate between main GUI interface and top level GUI interface
我在 GUI 的通信之间有问题。我的程序包含一个主界面,该界面创建于
class maininterface():
和其他在不同 class 中创建的顶级接口:
class Interface_PowerBalance()
。主界面控制其他顶级界面。我的问题是我不想将顶层接口的某些属性的信息接收到主接口中,但我没有实现。
这是我创建主 GUI 的 class maininterface():
。
class mainInterface():
def __init__(self,root,title):
self.root=root
self.root.title(title)
self.Widgets()
def Widgets(self):
self.PowerBalanceLabel=Label(self.root,text='Power balance is:')
self.PowerBalanceLabel.grid(row=0,column=1)
self.Button_InterfacePowerBalance=Button(root,command=self.PowerBalanceframe)
self.Button_InterfacePowerBalance.grid(column=0,row=0)
def PowerBalanceframe(self):
self.Power=Interface_PowerBalance(self.root,'Power balance interface').PowerBalance()
self.PowerBalanceLabel.config(text='Power balance is: '+str(self.Power))
当我单击 self.Buttton_InterfacePowerBalance
时,程序会使用下一个代码在 class Interface_PowerBalance()
中创建顶级界面:
class Interface_PowerBalance():
""" This class creates the interface to obtain the power balance """
def __init__(self,root,title):
self.root=root
self.PowerBalanceFrame=Toplevel(self.root)
self.PowerBalanceFrame.title(title)
self.value=DoubleVar()
self.valueList=[]
self.Widget()
def Widget(self):
self.myentry_value = Entry(self.PowerBalanceFrame,textvariable=self.value)
self.myentry_value.grid(row=2,column=2)
self.Button1=Button(self.PowerBalanceFrame, text='Insert a device', command=self.StoreData)
self.Button1.grid(row=0,column=0)
def StoreData(self):
self.valueList.append(self.value.get())
self.PowerBalance()
def PowerBalance(self,*args):
self.Power=float(self.Power)
N=len(self.valueList)
for j in range (0,N):
self.Power=self.Power+float(self.valueList[j])
self.PowerLabel=Label(self.PowerBalanceFrame,text=str(self.Power))
self.PowerLabel.grid(row=6,column=2)
return self.Power
我的程序现在做的是在打开这个顶级界面时从class Interface_PowerBalance():
接收self.Power
属性,并在self.PowerBalanceLabel
的主界面中显示它。
我想要做的是在每次更改 时从 class Interface_PowerBalance():
接收 self.Power
属性,并在 self.PowerBalanceLabel
的主界面中显示它。
不知道有没有道理
谢谢。
首先在mainInterface
中创建一个变量power,因为你想一直跟踪它:
class mainInterface():
def __init__(self,root,title):
self.root=root
self.root.title(title)
self.Widgets()
self.Power = 0.0 # Here you will store the Power value
其次,你不会改变PowerBalanceFrame
方法中标签的值,因为你没有绑定toplevel
知道什么时候关闭,所以把它改成:
def PowerBalanceframe(self):
Interface_PowerBalance(self,'Power balance interface').PowerBalance()
现在的诀窍在于如何创建 toplevel
。您希望它编辑主界面的标签,因此您必须将 main 作为参数传递(请参阅我传递 self
作为参数而不是 self.root
),因此您必须更改 __init__
Interface_PowerBalance
:
class Interface_PowerBalance():
""" This class creates the interface to obtain the power balance """
def __init__(self,main,title):
self.main = main # here main is the main interface
self.root=main.root # thus main.root is the root
self.PowerBalanceFrame=Toplevel(self.root)
self.PowerBalanceFrame.title(title)
self.value=DoubleVar()
self.valueList=[]
self.Widget()
现在您可以访问 main.Power
和 main.PowerBalanceLabel
,因此只需将 PowerBalance
方法更改为:
def PowerBalance(self,*args):
N=len(self.valueList)
for j in range (0,N):
self.main.Power=self.main.Power+float(self.valueList[j])
self.PowerLabel=Label(self.PowerBalanceFrame,text=str(self.main.Power))
self.PowerLabel.grid(row=6,column=2)
self.main.PowerBalanceLabel['text'] = "Power balance is: " + str(self.main.Power) #here is where you edit the main GUI
这会起作用,但我要警告你,你的代码不是很好。首先,如果您将 mainInterface
用作 tk.Tk
的子项会好得多。其次,您可以使用 tkinter 变量来跟踪电源并使用 bind 来识别它何时更改。最后但同样重要的是,变量应该是小写的,类 是大写的。
我在 GUI 的通信之间有问题。我的程序包含一个主界面,该界面创建于
class maininterface():
和其他在不同 class 中创建的顶级接口:
class Interface_PowerBalance()
。主界面控制其他顶级界面。我的问题是我不想将顶层接口的某些属性的信息接收到主接口中,但我没有实现。
这是我创建主 GUI 的 class maininterface():
。
class mainInterface():
def __init__(self,root,title):
self.root=root
self.root.title(title)
self.Widgets()
def Widgets(self):
self.PowerBalanceLabel=Label(self.root,text='Power balance is:')
self.PowerBalanceLabel.grid(row=0,column=1)
self.Button_InterfacePowerBalance=Button(root,command=self.PowerBalanceframe)
self.Button_InterfacePowerBalance.grid(column=0,row=0)
def PowerBalanceframe(self):
self.Power=Interface_PowerBalance(self.root,'Power balance interface').PowerBalance()
self.PowerBalanceLabel.config(text='Power balance is: '+str(self.Power))
当我单击 self.Buttton_InterfacePowerBalance
时,程序会使用下一个代码在 class Interface_PowerBalance()
中创建顶级界面:
class Interface_PowerBalance():
""" This class creates the interface to obtain the power balance """
def __init__(self,root,title):
self.root=root
self.PowerBalanceFrame=Toplevel(self.root)
self.PowerBalanceFrame.title(title)
self.value=DoubleVar()
self.valueList=[]
self.Widget()
def Widget(self):
self.myentry_value = Entry(self.PowerBalanceFrame,textvariable=self.value)
self.myentry_value.grid(row=2,column=2)
self.Button1=Button(self.PowerBalanceFrame, text='Insert a device', command=self.StoreData)
self.Button1.grid(row=0,column=0)
def StoreData(self):
self.valueList.append(self.value.get())
self.PowerBalance()
def PowerBalance(self,*args):
self.Power=float(self.Power)
N=len(self.valueList)
for j in range (0,N):
self.Power=self.Power+float(self.valueList[j])
self.PowerLabel=Label(self.PowerBalanceFrame,text=str(self.Power))
self.PowerLabel.grid(row=6,column=2)
return self.Power
我的程序现在做的是在打开这个顶级界面时从class Interface_PowerBalance():
接收self.Power
属性,并在self.PowerBalanceLabel
的主界面中显示它。
我想要做的是在每次更改 时从 class Interface_PowerBalance():
接收 self.Power
属性,并在 self.PowerBalanceLabel
的主界面中显示它。
不知道有没有道理
谢谢。
首先在mainInterface
中创建一个变量power,因为你想一直跟踪它:
class mainInterface():
def __init__(self,root,title):
self.root=root
self.root.title(title)
self.Widgets()
self.Power = 0.0 # Here you will store the Power value
其次,你不会改变PowerBalanceFrame
方法中标签的值,因为你没有绑定toplevel
知道什么时候关闭,所以把它改成:
def PowerBalanceframe(self):
Interface_PowerBalance(self,'Power balance interface').PowerBalance()
现在的诀窍在于如何创建 toplevel
。您希望它编辑主界面的标签,因此您必须将 main 作为参数传递(请参阅我传递 self
作为参数而不是 self.root
),因此您必须更改 __init__
Interface_PowerBalance
:
class Interface_PowerBalance():
""" This class creates the interface to obtain the power balance """
def __init__(self,main,title):
self.main = main # here main is the main interface
self.root=main.root # thus main.root is the root
self.PowerBalanceFrame=Toplevel(self.root)
self.PowerBalanceFrame.title(title)
self.value=DoubleVar()
self.valueList=[]
self.Widget()
现在您可以访问 main.Power
和 main.PowerBalanceLabel
,因此只需将 PowerBalance
方法更改为:
def PowerBalance(self,*args):
N=len(self.valueList)
for j in range (0,N):
self.main.Power=self.main.Power+float(self.valueList[j])
self.PowerLabel=Label(self.PowerBalanceFrame,text=str(self.main.Power))
self.PowerLabel.grid(row=6,column=2)
self.main.PowerBalanceLabel['text'] = "Power balance is: " + str(self.main.Power) #here is where you edit the main GUI
这会起作用,但我要警告你,你的代码不是很好。首先,如果您将 mainInterface
用作 tk.Tk
的子项会好得多。其次,您可以使用 tkinter 变量来跟踪电源并使用 bind 来识别它何时更改。最后但同样重要的是,变量应该是小写的,类 是大写的。