python,tkinter:如何通过单个按钮从所有笔记本标签中获取所有变量?

问题描述:

我需要通过单击确定按钮返回所有选项卡中的所有变量。 我有两个选项卡。我想要的是,当我在第二个选项卡中输入某个值时,它应该自动出现在“高度”条目的第一个选项卡中。 然后,如果我在第一个选项卡中单击“确定”,它应该将所有变量(从第一个选项卡和第二个选项卡)返回到我的“主”程序以供进一步使用。 感谢python,tkinter:如何通过单个按钮从所有笔记本标签中获取所有变量?

from tkinter import * 
from tkinter import ttk 

class App1(ttk.Frame): 
    def createWidgets(self): 
     #text variables 
     self.i_height = StringVar() 
     self.i_weight = StringVar() 
     self.o_bmi = StringVar() 

     #labels 
     self.label1 = ttk.Label(self, text="Enter your weight:").grid(row=0, column=0, sticky=W) 
     self.label2 = ttk.Label(self, text="Enter your height:").grid(row=1, column=0, sticky=W) 
     self.label3 = ttk.Label(self, text="Your BMI is:").grid(row=2, column=0, sticky=W) 

     #text boxes 
     self.textbox1 = ttk.Entry(self, textvariable=self.i_weight).grid(row=0, column=1, sticky=E) 
     self.textbox2 = ttk.Entry(self, textvariable=self.i_height).grid(row=1, column=1, sticky=E) 
     self.textbox3 = ttk.Entry(self, textvariable=self.o_bmi).grid(row=2, column=1, sticky=E) 

     #buttons 
     self.button1 = ttk.Button(self, text="Cancel/Quit", command=self.quit).grid(row=3, column=1, sticky=E) 
     self.button1 = ttk.Button(self, text="Ok", command=self.calculateBmi).grid(row=3, column=2, sticky=E) 

    def calculateBmi(self): 
     try: 
      self.weight = float(self.i_weight.get()) 
      self.height = float(self.i_height.get()) 
      self.bmi = self.weight/self.height ** 2.0 
      self.o_bmi.set(self.bmi) 
     except ValueError: 
      messagebox.showinfo("Error", "You can only use numbers.") 
     finally: 
      self.i_weight.set("") 
      self.i_height.set("") 

    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     self.createWidgets() 

class App2(ttk.Frame): 
    def create_widgets(self): 
     """Create the widgets for the GUI""" 
     #1 textbox (stringvar) 
     self.entry= StringVar() 
     self.textBox1= ttk.Entry(self, textvariable=self.entry).grid(row=0, column=1) 

     #5 labels (3 static, 1 stringvar) 
     self.displayLabel1 = ttk.Label(self, text="feet").grid(row=0, column=2, sticky=W) 
     self.displayLabel2 = ttk.Label(self, text="is equivalent to:").grid(row=1, column=0) 
     self.result= StringVar() 
     self.displayLabel3 = ttk.Label(self, textvariable=self.result).grid(row=1, column=1) 
     self.displayLabel4 = ttk.Label(self, text="meters").grid(row=1, column=2, sticky=W) 

     #2 buttons 
     self.quitButton = ttk.Button(self, text="Quit", command=self.quit).grid(row=2, column=1, sticky=(S,E)) 
     self.calculateButton = ttk.Button(self, text="Calculate", command=self.convert_feet_to_meters).grid(row=2, column=2, sticky=(S,E)) 

    def convert_feet_to_meters(self): 
     """Converts feet to meters, uses string vars and converts them to floats""" 
     self.measurement = float(self.entry.get()) 
     self.meters = self.measurement * 0.3048 
     self.result.set(self.meters) 

    def __init__(self, master=None): 
     ttk.Frame.__init__(self, master) 
     self.grid() 
     self.create_widgets() 

def button1_click(): 
    root = Tk() 
    app = App1(master=root) 
    app.mainloop() 

def button2_click(): 
    root = Tk() 
    app = App2(master=root) 
    app.mainloop() 
def main(): 
    #Setup Tk() 
    window = Tk() 

    #Setup the notebook (tabs) 
    notebook = ttk.Notebook(window) 
    frame1 = ttk.Frame(notebook) 
    frame2 = ttk.Frame(notebook) 
    notebook.add(frame1, text="BMI Calc") 
    notebook.add(frame2, text="Feet to Meters") 
    notebook.grid() 

    #Create tab frames 
    app1 = App1(master=frame1) 
    app1.grid() 
    app2 = App2(master=frame2) 
    app2.grid() 

    #Main loop 
    window.mainloop() 
main() 

你在你的程序的一些基本的错误 - 你不能在同一连续3个mainloops。您应该始终只有Tk的一个实例,并且只需调用一次mainloop。

无论如何,解决方案是您需要在应用程序中创建方法或公共变量,然后您的按钮回调需要能够调用该方法或访问该变量。

例如,你会做这样的:

def callback(): 
    value1 = app1.getValue() 
    value2 = app2.getValue() 
    ...