Передать атрибуты классу в новом фрейме Tkinter - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу передать идентификатор переменной в функции read_card (), которая была прочитана MFRC522, в класс MenuPage. MenuPage - это новая рамка Tkinter, которую я хочу открыть. Почему-то это не работает. Я получаю ошибку аргумента. Он ожидает 3 аргумента, но я даю только 2. Вы можете мне помочь?

import Tkinter as tk
from PIL import Image, ImageTk

import RPi.GPIO as GPIO
from mfrc522 import SimpleMFRC522

import tkMessageBox

def on_closing():
    if tkMessageBox.askokcancel("Beenden", "Wollen Sie Pi Banking beenden?"):
        app.destroy()

def read_card():
    reader = SimpleMFRC522()

    try:
        id, text = reader.read_no_block()

        if id != None:
            menuPage = MenuPage(id)
            app.switch_frame(menuPage)
        else:
            tkMessageBox.showerror("Fehler", "Die Karte konnte nicht gelesen werden. Bitte halten Sie Ihre Karte zum NFC-Kontaktpunkt und versuchen Sie es erneut.")    
    finally:
        GPIO.cleanup()

class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self._frame = None
        self.switch_frame(MainPage)

    def switch_frame(self, frame_class):
        new_frame = frame_class(self)
        if self._frame is not None:
            self._frame.destroy()
        self._frame = new_frame
        self._frame.pack()

class MainPage(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        master.title("Pi Banking")
        master.attributes('-zoomed', True)

        label = tk.Label(self, text="Pi Banking", font=("Helvetica", 48, 'bold'))
        label.pack(padx=20, pady=20)

        self.logo = ImageTk.PhotoImage(Image.open("Raspi.png"))
        panel = tk.Label(self, image = self.logo)
        panel.pack()

        label = tk.Label(self, text="Bitte halten Sie Ihre Karte zum NFC-Kontaktpunkt und klicken Sie auf \"Karte lesen\"!", font=("Helvetica", 16))
        label.pack(padx=20, pady=20)

        button = tk.Button(self, text="Karte lesen", font=("Helvetica", 16), command=read_card)
        button.pack()

class MenuPage(tk.Frame): 
    def __init__(self, master, card_id):
        self.card_id = card_id
        tk.Frame.__init__(self, master)
        master.title("Pi Banking - Menu")

if __name__ == "__main__":
    app = App()
    app.protocol("WM_DELETE_WINDOW", on_closing)
    app.mainloop()

Я получаю ошибку:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1550, in __call__
    return self.func(*args)
  File "bankomat.py", line 20, in read_card
    menuPage = MenuPage(id)
TypeError: __init__() takes exactly 3 arguments (2 given)

1 Ответ

0 голосов
/ 16 апреля 2020

Это потому, что вы передали экземпляр MenuPage в app.switch_frame(), который ожидает ссылку на класс.

Вы можете изменить функцию switch_frame(), как показано ниже:

def switch_frame(self, frame_class, *args, **kwargs):
    new_frame = frame_class(self, *args, **kwargs)
    if self._frame is not None:
        self._frame.destroy()
    self._frame = new_frame
    self._frame.pack()

Затем позвоните app.switch_frame() в read_card(), как показано ниже:

if id is not None:
    app.switch_frame(MenuPage, id)
else:
    tkMessageBox.showerror(...)    
...