首页 > 解决方案 > 使用按钮提升不同的框架,具体取决于单选按钮的值

问题描述

让我先说我对 Python 比较陌生,所以我的脚本可能不是很 Pythonic——为此道歉!

无论如何,我重新调整了一些代码的用途,以便我目前有一个带有许多单选按钮(第 1 页、第 2 页、....第 6 页)、一个退出按钮和一个下一步按钮的起始页。我希望能够选择其中一个单选按钮,然后按“下一步”按钮进入由所选单选按钮指定的页面。为了简洁起见,代码已从 PageOne() 等中删除。

我看过的其他 QA 涉及将函数链接到按钮,但不涉及如何使函数依赖于其他输入。

目前我收到错误

AttributeError: '_tkinter.tkapp' object has no attribute 'PageSelection'

import tkinter as tk
from tkinter import ttk

LARGE_FONT = ('Verdana', 12)
NORM_FONT = ('Verdana', 10)
SMALL_FONT = ('Verdana', 8)    

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

        tk.Tk.iconbitmap(self, default="icon.ico")
        tk.Tk.wm_title(self, "Page Selector")

        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 (StartPage, PageOne, PageTwo, PageThree, PageFour, PageFive, PageSix):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew',padx=20, pady=20)
        self.ShowFrame(StartPage)

    def ShowFrame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage(tk.Frame):
    def PageSelection(self, controller, page_val):
        page_choice = page_val.get()
        if page_choice == 1:
            controller.ShowFrame(PageOne)
        elif page_choice == 2:
            controller.ShowFrame(PageTwo)
        elif page_choice == 3:
            controller.ShowFrame(PageThree)
        elif page_choice == 4:
            controller.ShowFrame(PageFour)
        elif page_choice == 5:
            controller.ShowFrame(PageFive)
        else:
            controller.ShowFrame(PageSix)

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text='Page Selection', font='LARGE_FONT')
        description = ttk.Label(self, text='Please select a page:')
        label.grid(row=0,column=0, sticky='w',padx=20, pady=5, columnspan=2)
        description.grid(row=1, column=0, sticky='w', padx=20, pady=5, columnspan=2)

        page_val = tk.IntVar()

        rad_button1 = ttk.Radiobutton(self, text='Page 1', value=1, variable=page_val)
        rad_button1.grid(row=3, column=2, sticky='sw')
        rad_button2 = ttk.Radiobutton(self, text='Page 2', value=2, variable=page_val)
        rad_button2.grid(row=4, column=2, sticky='sw')
        rad_button3 = ttk.Radiobutton(self, text='Page 3', value=3, variable=page_val)
        rad_button3.grid(row=5, column=2, sticky='sw')
        rad_button4 = ttk.Radiobutton(self, text='Page 4', value=4, variable=page_val)
        rad_button4.grid(row=6, column=2, sticky='sw')
        rad_button5 = ttk.Radiobutton(self, text='Page 5', value=5, variable=page_val)
        rad_button5.grid(row=7, column=2, sticky='sw')
        rad_button6 = ttk.Radiobutton(self, text='Page 6', value=6, variable=page_val)
        rad_button6.grid(row=8, column=2, sticky='sw')

        col_pad = ttk.Label(self, text='').grid(row=9, column=3, pady=25, padx=25)

        quit_button= ttk.Button(self, text='Quit', command=quit)
        quit_button.grid(row=10, column=4, sticky='e')

        nxt = ttk.Button(self, text='Next >', command=lambda: PageSelection(page_val))
        nxt.grid(row=10,column=5, sticky='w')


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


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

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


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

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


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

app = PageSelectionWiz()
app.geometry('640x480-8-8')
app.mainloop()

标签: pythontkinter

解决方案


问题出在这一行:

nxt = ttk.Button(self, text='Next >', command = lambda:self.PageSelection(page_val)). 

它引发以下错误:

TypeError:PageSelection() 缺少 1 个必需的位置参数:'page_val'

您需要再添加一个参数,controller. 因此,只需将上述行改为:

nxt = ttk.Button(self, text='Next >', command = lambda:self.PageSelection(controller, page_val)). 

将解决问题。确保您添加了函数中所需的所有参数。

完整代码:

import tkinter as tk
from tkinter import ttk

LARGE_FONT = ('Verdana', 12)
NORM_FONT = ('Verdana', 10)
SMALL_FONT = ('Verdana', 8)    

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


        tk.Tk.wm_title(self, "Page Selector")

        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 (StartPage, PageOne, PageTwo, PageThree, PageFour, PageFive, PageSix):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky='nsew',padx=20, pady=20)
        self.ShowFrame(StartPage)

    def ShowFrame(self, cont):
        frame = self.frames[cont]
        frame.tkraise()

class StartPage(tk.Frame):
    def PageSelection(self, controller, page_val):
        page_choice = page_val.get()
        if page_choice == 1:
            controller.ShowFrame(PageOne)
        elif page_choice == 2:
            controller.ShowFrame(PageTwo)
        elif page_choice == 3:
            controller.ShowFrame(PageThree)
        elif page_choice == 4:
            controller.ShowFrame(PageFour)
        elif page_choice == 5:
            controller.ShowFrame(PageFive)
        else:
            controller.ShowFrame(PageSix)

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text='Page Selection', font='LARGE_FONT')
        description = ttk.Label(self, text='Please select a page:')
        label.grid(row=0,column=0, sticky='w',padx=20, pady=5, columnspan=2)
        description.grid(row=1, column=0, sticky='w', padx=20, pady=5, columnspan=2)

        page_val = tk.IntVar()

        rad_button1 = ttk.Radiobutton(self, text='Page 1', value=1, variable=page_val)
        rad_button1.grid(row=3, column=2, sticky='sw')
        rad_button2 = ttk.Radiobutton(self, text='Page 2', value=2, variable=page_val)
        rad_button2.grid(row=4, column=2, sticky='sw')
        rad_button3 = ttk.Radiobutton(self, text='Page 3', value=3, variable=page_val)
        rad_button3.grid(row=5, column=2, sticky='sw')
        rad_button4 = ttk.Radiobutton(self, text='Page 4', value=4, variable=page_val)
        rad_button4.grid(row=6, column=2, sticky='sw')
        rad_button5 = ttk.Radiobutton(self, text='Page 5', value=5, variable=page_val)
        rad_button5.grid(row=7, column=2, sticky='sw')
        rad_button6 = ttk.Radiobutton(self, text='Page 6', value=6, variable=page_val)
        rad_button6.grid(row=8, column=2, sticky='sw')

        col_pad = ttk.Label(self, text='').grid(row=9, column=3, pady=25, padx=25)

        quit_button= ttk.Button(self, text='Quit', command = quit)
        quit_button.grid(row=10, column=4, sticky='e')

        nxt = ttk.Button(self, text='Next >', command = lambda: self.PageSelection(controller, page_val))
        nxt.grid(row=10,column=5, sticky='w')


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


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

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


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

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


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

app = PageSelectionWiz()
app.geometry('640x480-8-8')
app.mainloop()

推荐阅读