2015-09-04 3 views
0

Я опубликовал что-то об этом раньше и как ответ, который, как я думал, решил мою проблему, но он не полностью ее разрешил. В принципе, я ищу способ передать StringVar() из моего первого метода под названием «main_frame» ко второму методу, называемому «result_frame», когда нажата кнопка в методе «main_frame».Передача переменных между двумя окнами Tkinter

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() 

Как вы можете видеть, в одном окне будет поле ввода, в котором вы можете ввести город. Запись сохранит содержимое в StringVar(). Я хочу, чтобы моя кнопка в методе «main_frame» вызывала «result_frame» и использовала значение, находящееся в моем первом окне. Если я добавлю параметр ко второму методу, мне нужно будет сразу указать его в моей кнопке, и это, конечно же, сразу вызовет его, когда программа будет открыта, чего я хочу избежать. Я прошу прощения, если это простое решение, которого я просто пропустил здесь, я боролся с этим какое-то время без решения. Мне сказали, что в прошлый раз я отправил это, чтобы вызвать только один экземпляр Tk(), который я сделал здесь, и использовал Toplevel() для моего дополнительного окна, но у меня все еще есть проблемы с передачей переменной из одного окна в другое.

ответ

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() 
+0

Спасибо !!! Я думаю, что моя проблема была в том, что я не работал за пределами класса. Я действительно пытался таким образом раньше и потому, что root был вызван в классе, он не работал. Еще раз спасибо! – BroccolliBeef

Смежные вопросы