在主 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.Powermain.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 来识别它何时更改。最后但同样重要的是,变量应该是小写的,类 是大写的。