python - 使用按钮提升不同的框架,具体取决于单选按钮的值
问题描述
让我先说我对 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()
解决方案
问题出在这一行:
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()
推荐阅读
- strapi - Strapi 中是否有针对单一类型的草稿系统?
- jquery - 使用 cors ajax 到新窗口时丢失的 cookie
- momentjs - 无法从 NiFi ExecuteScript 处理器引用外部 JS
- django - Django REST Framework - paginate_queryset() 接受 2 个位置参数,但给出了 3 个
- database - 如何实现数据网格概念数据工程产品或应用
- javascript - 在复杂的嵌套 json 数据中搜索
- angular - 选择选项更改时的调用方法?(角度)
- asp.net-core - 由于 .NetCore 中的 CORS 策略,无法访问令牌
- java - 为什么即使删除了 SLF4J 标记也会看到
- python - 试图在我的 Django 应用程序上创建第二个 forms.py 以在同一页面上发布