将变量传递到框架

时间:2019-05-30 01:30:31

标签: python tkinter

我正在创建密码管理器软件。密码存储在不同的类别中。当我单击类别时,应打开 ViewPasswordsInsideCategory 页面。 我无法将类别名称传递到 ViewPasswordsInsideCategory 页面。 请帮忙!我是Python的新手,无法解决此问题。

当我可以使用 showframe 函数时,我试图传递一个参数,但我没有达到目标。

class PasswordPage(Page):
    def __init__(self, *args, **kwargs):
        Page.__init__(self, *args, **kwargs)

        self.shared_data = {
            "category": tk.StringVar(),
            "password": tk.StringVar()}

        self.passwordScreen = Frame(self)
        self.passwordScreen.pack(fill="both", expand=True)
        self.passwordScreen.columnconfigure(0, weight=1)
        self.passwordScreen.rowconfigure(0, weight=1)

        self.frames = {}

        for F in (PasswordCategoryPage,ViewPasswords_InCategory,CreateNewPassword,ViewPassword,ModifyPassword):
            page_name = F.__name__
            frame = F(parent=self.passwordScreen, controller=self)
            self.frames[page_name] = frame


            frame.grid(row=0, column=0, sticky="nsew")

        self.show_frame("PasswordCategoryPage")

    def show_frame(self, page_name, arg=None):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()
class PasswordCategoryPage(tk.Frame):


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

        # passwords categories content

        self.labels = []

        self.dict = {'Home': 'Blue', 'Work': 'Red', 'School': 'Yellow', "Technical": 'Pink', "Office": 'Orange'}
        self.button = []

        j = 0
        for key, value in self.dict.items():
            self.name = key
            self.key = Label(self.pass_page_container,text=self.name,bg=value)

            # Add the Label to the list
            self.labels.append(key)

            self.key.grid(row=j, column=0, sticky=(N, S, E, W))
            self.key.bind("<Double-Button-1>", self.showPasswordPage)
            j = j + 1

    def showPasswordPage(self,event):
        #here need to pass the label that was clicked to the ViewPasswords_InCategory page
        self.controller.show_frame("ViewPasswords_InCategory")

class ViewPasswords_InCategory(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
 #here need the name of the category selected to extract data from database

        # home banner
        home_label = Label(self, text=here need the name of the category, bg="blue", width=200, height=3, fg='white')
        home_label.pack(side=TOP, expand=False)


1 个答案:

答案 0 :(得分:0)

简单的方法是在类ViewPasswords_InCategory中添加一个新函数来更新标题。然后,无论何时切换到页面,都调用新函数。我建议的更改是:

1)返回函数PasswordPage.show_frame(...)中引发的帧:

class PasswordPage(Page):
    ...
    def show_frame(self, page_name, arg=None):
        '''Show a frame for the given page name'''
        frame = self.frames[page_name]
        frame.tkraise()
        return frame  # return the raised frame

2)添加新功能,例如在类set_category(...)中添加ViewPasswords_InCategory以更新其标语:

class ViewPasswords_InCategory(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        # home banner
        self.home_label = Label(self, text='', bg="blue", width=200, height=3, fg='white') # changed to instance variable
        self.home_label.pack(side=TOP, expand=False)

    # new function to update banner
    def set_category(self, category):
        self.home_label['text'] = category

3)更新PasswordCategoryPage.showPasswordPage(...)来调用新功能:

class PasswordCategoryPage(tk.Frame):
    ...
    def showPasswordPage(self,event):
        #here need to pass the label that was clicked to the ViewPasswords_InCategory page
        self.controller.show_frame("ViewPasswords_InCategory").set_category(event.widget['text'])