2015-07-13 2 views
1

Я пытаюсь написать многооконное приложение с Tkinter и python. Мне удалось создать графический интерфейс, и он перетекает с одной страницы на другую, но я не знаю, как передавать информацию, собранную на одном кадре, на другой фрейм.Передать переменные/значения из одного кадра в другой - Tkinter/Python

Вот мой главный класс приложения:

class SampleApp(tk.Tk): 

    def __init__(self, *args, **kwargs): 
    tk.Tk.__init__(self, *args, **kwargs) 

    # the container is where we'll stack a bunch of frames 
    # on top of each other, then the one we want visible 
    # will be raised above the others 
    container = tk.Frame(self) 
    container.pack(side="top", fill="both", expand=True) 
    container.grid_rowconfigure(0, weight=1) 
    container.grid_columnconfigure(0, weight=1) 

    self.frames = {} 
    for F in (MainMenu, ScanItem, Account, Confirm, RemoveItem): 
    frame = F(container, self) 
    self.frames[F] = frame 
    # put all of the pages in the same location; 
    # the one on the top of the stacking order 
    # will be the one that is visible. 
    frame.grid(row=0, column=0, sticky="news") 

    self.show_frame(MainMenu) 

def show_frame(self, c): 
    # Show a frame for the given class 
    frame = self.frames[c] 
    frame.tkraise() 

ScanItem рам:

class ScanItem(tk.Frame): 

    def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 
    self.__barcode = tk.StringVar(None) 

    barcode = tk.Entry(self, textvariable=self.__barcode, 
        font="Helvetica 16 bold", justify="center") 
    cancel_btn = tk.Button(self, text="Cancel", 
         command=lambda: controller.show_frame(MainMenu)) 
    tk.Label(self, font="Helvetica 16 bold", text="Scan Item").grid(
      row=0, column=0, columnspan=6, sticky="news") 

    barcode.grid(row=2, column=1, columnspan=4, sticky="news") 
    cancel_btn.grid(row=4, column=1, columnspan=4, sticky="news", pady=10) 

    # focus cursor on barcode entry widget 
    barcode.focus_set() 
    # usb scanner output has a <Return> character at the end of the barcode 
    barcode.bind('<Return>', (lambda event: self.lookup())) 

    for i in range(5): 
     self.grid_rowconfigure(i, weight=1) 
    for j in range(6): 
     self.grid_columnconfigure(j, weight=1) 

    def get_barcode(self): 
    return self.__barcode 

    def lookup(self): 
    # tkMessageBox.showinfo("Barcode Scanned", self.__barcode.get()) 
    self.__controller.show_frame(Confirm) 

Подтверждение кадр:

class Confirm(tk.Frame): 

    def __init__(self, parent, controller): 
    tk.Frame.__init__(self, parent) 

    barcode = tk.Label(self, font="Helvetica 8 bold", 
        text="Barcode from Scan Item goes here") 
    cancel_btn = tk.Button(self, text="Cancel", width=100, 
         command=lambda: controller.show_frame(MainMenu)) 
    submit_btn = tk.Button(self, text="Submit", width=100) 

    tk.Label(self, font="Helvetica 16 bold", text="Confirm Barcode").grid(
      row=0, column=0, columnspan=6, sticky="news") 
    barcode.grid(row=1, column=1, columnspan=4, sticky="news") 
    cancel_btn.grid(row=2, column=0, columnspan=3, sticky="news") 
    submit_btn.grid(row=2, column=3, columnspan=3, sticky="news") 

    for i in range(3): 
     self.grid_rowconfigure(i, weight=1) 
    for j in range(6): 
     self.grid_columnconfigure(j, weight=1) 

Я хотел бы получить штрих-код от виджета ScanItem входа в класс Confirm (Frame), поэтому я показываю его на другом кадре (и, в конце концов, делаю другие вещи с информацией rmation прошло). Как передать информацию из класса ScanItem классу Confirm?

Заранее спасибо.

+0

Начните читать: https://stackoverflow.com/a/33650527/7432 –

ответ

0

Вы можете добиться этого (поскольку у вас есть чистое отношение родитель-ребенок к вашим окнам), используя функции стиля стиля (getters/seters).

Лично я бы не стал создавать окно подтверждения, например self.__controller.show_frame(Confirm).

Вы можете создать экземпляр своего класса, например self.__confirmFrame=Confirm(), а затем позвонить сеттерам по телефону self.__confirmFrame.

Чтобы вернуть значения, вы можете либо создать событие, либо связать его, либо использовать геттеры и вызвать их. Лучшей практикой здесь было бы (мое личное мнение) сочетание обоих - например, создайте событие в submit_btn событии кликов, а затем привяжите созданное событие (например, "<< submit >>") в своем родительском фрейме, чтобы вызвать получатели нужных значений. То же самое можно сделать (если необходимо) на cancel_btn событий клика.

+0

Спасибо за помощь. Работает так же, как вы сказали. –

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