在两个窗口Tkinter之间传递变量

时间:2015-09-04 00:10:47

标签: python user-interface tkinter

我之前发布了一些有关此问题的内容以及我认为如何解决我的问题,但它没有完全解决问题。基本上,当我点击'main_frame'方法中的按钮时,我正在寻找一种方法将StringVar()从我的第一个名为'main_frame'的方法传递到我的第二个方法'result_frame'。

from Tkinter import *
import Forecast


class Frames(object):

    def __init__(self):
        pass

    def main_frame(self):
        root = Tk()
        root.title('WeatherMe')
        root.geometry('300x100')

        query = StringVar()

        Label(root, text='Enter a city below').pack()

        Entry(root, textvariable=query).pack()

        Button(root, text="Submit", command=self.result_frame).pack()

        root.mainloop()

    def result_frame(self):
        result = Toplevel()
        result.title('City')
        result.geometry('1600x150')

        forecast = Forecast.GetWeather('City Here').fetch_weather()

        Label(result, text='1-3 DAY: \n' + forecast[0]).pack()
        Label(result, text='4-7 DAY: \n' + forecast[1]).pack()
        Label(result, text='8-10 DAY: \n' + forecast[2]).pack()

        Button(result, text="OK", command=result.destroy).pack()

正如您所看到的,一个窗口将有一个Entry框,您可以在其中键入城市。该条目将其内容保存到StringVar()。我想让'main_frame'方法中的按钮调用'result_frame'并使用我第一个窗口中的值。如果我向第二种方法添加一个参数,那么我必须立即在我的按钮中指定它,当然打开程序时我会立即调用它,我想避免。我很抱歉,如果这是一个简单的解决方案,我只是在这里失踪,我一直在努力解决这个问题。有人告诉我上次我发布这个只调用一个Tk()的实例,我在这里做了一个实例,并使用Toplevel()作为我的附加窗口,但是我仍然有问题将变量从一个窗口传递到另一个窗口。

1 个答案:

答案 0 :(得分:3)

您的self(对象)在__init__()result_frame()中都是相同的,因此您可以将StringVar()设置为实例变量,然后在result_frame()方法,您可以从该实例变量中获取StringVar()

另外,我建议您不要在类的方法中执行root.mainloop(),这会导致在实际关闭tkinter应用程序之前,对象永远不会在类之外完全可用(如果从__init__()左右开始调用。而是在类外创建root并将其作为变量传递。示例 -

from Tkinter import *
import Forecast

class Frames(object):

    def __init__(self):
        pass

    def main_frame(self, root):
        root.title('WeatherMe')
        root.geometry('300x100')

        self.query = StringVar()

        Label(root, text='Enter a city below').pack()

        Entry(root, textvariable=self.query).pack()

        Button(root, text="Submit", command=self.result_frame).pack()

    def result_frame(self):
        result = Toplevel()
        result.title('City')
        result.geometry('1600x150')

        print(self.query.get()) #This would print the StringVar's value , use this in whatever way you want.

        forecast = Forecast.GetWeather('City Here').fetch_weather()

        Label(result, text='1-3 DAY: \n' + forecast[0]).pack()
        Label(result, text='4-7 DAY: \n' + forecast[1]).pack()
        Label(result, text='8-10 DAY: \n' + forecast[2]).pack()

        Button(result, text="OK", command=result.destroy).pack()


root = Tk()
app = Frames()
app.main_frame(root)
root.mainloop()