【问题标题】:Python/Tkinter Lambda Event Argument IssuePython/Tkinter Lambda 事件参数问题
【发布时间】:2018-04-19 02:26:21
【问题描述】:

我一直在尝试调用需要两个参数的函数 showframe。当我从主页中的按钮命令调用它时,它显示一个错误。 TypeError:showframe() 缺少 1 个必需的位置参数:'frame_name'我不明白为什么?正如我通过类名调用的那样,它应该自动获取自我,然后 frame_name 将获取 SignIn 类。但那没有发生。

class Culpture(Frame):
    def __init__(self, root):
        Frame.__init__(self, root)
        fhome = HomePage(root)
        fsignin = SignIn(root)
        self.showframe(fhome)
        fhome.grid(row=0, column=0, sticky='nsew')
        fsignin.grid(row=0, column=0, sticky='nsew')
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def showframe(self, frame_name):
        frame_name.tkraise()
class HomePage(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        Label(self, text="Homepage").grid()
        Button(self, text='SignIn', command=lambda: Culpture.showframe(SignIn), width=20).grid()

如果我这样做,

Button(self, text='SignIn', command=lambda: Culpture.showframe(parent, SignIn), width=20).grid()

然后它显示另一条错误消息。TypeError: tkraise() missing 1 required positional argument: 'self' 所以我试着看一些我得到的问题是接近我的解决方案Python/Tkinter Event Argument Issue ,但不一样。如果我尝试另一种方式 Button(self, text='SignIn', command=lambda: Culpture.showframe(parent, SignIn(parent)), width=20).grid() 然后它没有显示错误但按钮没有打开新框架。

class SignIn(Frame):
def __init__(self, parent):
    Frame.__init__(self, parent)
    Label(self, text="SignIn").grid()
    Button(self, text='Submit', width=20).grid()

所以如果你们中的任何人能帮助我,那将是非常有帮助的。

【问题讨论】:

  • 什么是SignIn
  • 不会出错,也不会打开登录框。

标签: python python-3.x tkinter


【解决方案1】:

你做事的方式不对。理想情况下,您应该为不同的页面创建不同的类,这将使代码不那么混乱。

因此,为 SignIn 和 home 分别创建一个不同的类。

以下是用python3写的:

import tkinter as tk
from tkinter import *

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

    F1=tk.Frame(self)
    F1.pack(side="top",fill="both",expand=True)

    F1.grid_rowconfigure(0,weight=1)
    F1.grid_columnconfigure(0,weight=1)

    self.frames={}

    for F in (Home,SignIn):                                       # Looping between the pages: Home, SignIn (if they are interconnected through buttons)
        frame=F(F1,self)                                          # If they are all not interconnected, make different loops for different sets all containg the same element Home

        self.frames[F]=frame
        frame.grid(row=0,column=0,sticky="nsew")


    self.show_frame(Home)

    def show_frame(self,cont):

    frame=self.frames[cont]
    frame.tkraise()

class Home(tk.Frame):                                                   # Home page

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

    label=Label(self,text="Home",foreground="blue")
    label.pack(pady=10,padx=10)

    signB=Button(self,text="SignIn",command=lambda:controller.show_frame(SignIn),foreground="snow", background="blue")

    signB.pack()
    #trajectory.tkinter.tix.balloon



class SignIn(tk.Frame):                                                # SignIn

    def __init__(self,parent,controller):
    tk.Frame.__init__(self,parent)
    label=Label(self,text="Enter datails",foreground="red")
    label.pack(pady=10,padx=10)

    home=Button(self,text="Home",command=lambda:controller.show_frame(Home),foreground="snow", background="red")
    home.pack()


root=Culpture()

root.mainloop()

如果这不起作用,请告诉我。 另外,添加更多页面:

如果它们是相互连接的 - 将类的名称添加到同一个循环中。

如果它们共同连接到某个页面,请使用名称制作一个新的 lop。

【讨论】:

  • import tkinter as tk & from tkinter import *... 为什么?
  • 在极少数情况下,当程序非常大时,您可能需要它来组织。这根本不是强制性的。我只是对我的大多数程序都这样做以避免错误(除非它滞后..)。
  • 此代码有效。但我不明白为什么我必须在 Culpture 中继承 Tk() 类而不是 Frame 类?虽然我使用字典作为框架类,但为什么我在 showframe self.show_frame(Home) 中传递了框架类而不是字典名称?
  • @AbdullahAlMubin:您不必从 Tk 类继承。您可以改为从 Frame 继承。只是你必须在某处有一个Tk 的实例,并且由于这是“主”框架,因此无需创建框架然后将其放置在空窗口中。
  • @EshitaShukla 你能解释一下虽然使用框架类的字典为什么我在 showframe self.show_frame(Home) 中传递了Home 类而不是字典名称self.show_frame(frames[Home]) 吗?
【解决方案2】:

您需要在代码中的某处创建Culpture 的实例。您需要使用该实例调用show_frame。当您这样做时,实例将自动作为self 参数传递,而您传递的参数将是frame_name

culpture = Culpture(root)
...
culpsure.show_frame(fsignin)

您没有显示创建Culpture 实例的位置,因此很难再具体说明。

【讨论】:

  • 这里的 showframe 没有得到“fsingin”的引用。 class HomePage(Frame): def __init__(self, parent): f1 = Culpture(parent) Frame.__init__(self, parent) Label(self, text="Homepage").grid() Button(self, text='SignIn', command=lambda: f1.showframe(fsignin), width=20).grid()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多