簡體   English   中英

python,tkinter 條目到達 function(錯誤來自 F 按鈕的 ZC1C425268E68385D14AB5074C17ZA49)

[英]python, tkinter entry get to function (error was with function call from button)

我在 8 小時內就能解決這個痛苦。 無論我做什么,入口值都不會傳遞到 function 中。 抱歉這個菜鳥問題

...

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

        name_var = tk.StringVar()

        name_entry = ttk.Entry(self, textvariable=name_var)
        name_entry.grid(row=1, column=1)

        button1 = ttk.Button(self, text="Registration", command=self.RegFunction(name_var.get()))
        button1.grid(row=4, column=4)

    def RegFunction(self, name)
        print(name) 

編輯:剛剛意識到,如果我向 function 添加一個變量,它會在我運行程序后立即被調用,並且它不關心按鈕; 但如果我不給它一個變量,它就會正常工作,只有當我按下按鈕時。 我一無所知。

這是整個代碼

import tkinter as tk
from tkinter import ttk

class ToDoList(tk.Tk):

    def __init__(self, *args, **kwargs):

        tk.Tk.__init__(self, *args, **kwargs)


        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 (LogIn, Registration):
            frame = F(container, self)

            self.frames[F] = frame

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

        self.show_frame(LogIn)

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

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

        # label of frame Layout 2
        label = ttk.Label(self, text="Log In")

        label.grid(row=0, column=4, padx=10, pady=10)

        username_label = ttk.Label(self, text="Username :")
        username_label.grid(row=1, column=1)

        password_label = ttk.Label(self, text="Password:")
        password_label.grid(row=2, column=1)

        usrname_entry = ttk.Entry(self)
        usrname_entry.grid(row=1, column=2)

        password_entry = ttk.Entry(self)
        password_entry.grid(row=2, column=2)


        button2 = ttk.Button(self, text="Registration",
                             command=lambda: controller.show_frame(Registration))


        button2.grid(row=4, column=1, padx=10, pady=10)


class Registration(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = ttk.Label(self, text="Registration")
        label.grid(row=0, column=4, padx=10, pady=10)

        name_label = ttk.Label(self, text="Username:")
        name_label.grid(row=1, column=0)
        pass1_label = ttk.Label(self, text="Password:")
        pass1_label.grid(row=2, column=0)
        pass2_label = ttk.Label(self, text="Password again:")
        pass2_label.grid(row=3, column=0)

        name_var = tk.StringVar()
        name_entry = ttk.Entry(self, textvariable=name_var)
        name_entry.grid(row=1, column=1)

        pass1_entry = ttk.Entry(self)
        pass1_entry.grid(row=2, column=1)
        pass2_entry = ttk.Entry(self)
        pass2_entry.grid(row=3, column=1)
        k = 12

        button1 = ttk.Button(self, text="Registration", command=self.RegFunction(k))

        button1.grid(row=4, column=4, padx=10, pady=10)

        button2 = ttk.Button(self, text="Back to Login",
                             command=lambda: controller.show_frame(LogIn))

        button2.grid(row=4, column=0, padx=10, pady=10)

    def RegFunction(self, x):
        print("Something", x)


app = ToDoList()
app.mainloop()

調用 function 和傳入函數名稱以便稍后調用它是有區別的。 ttk.Button command=期望傳入一個 function 名稱(或引用),以便稍后可以調用命名或引用的 function。 您正在調用 function 而不是傳遞其名稱,所以 go 是錯誤的。

改變:

    button1 = ttk.Button(self, text="Registration", command=self.RegFunction(name_var.get()))

至:

    button1 = ttk.Button(self, text="Registration", command=lambda: self.RegFunction(name_var.get()))

你會更接近你的目標。 lambda告訴 Python 不要調用 function 而只是返回對它的引用,以便以后調用它。

一旦你這樣做了,你會發現你的 function 定義中有一個錯字——你在def語句的末尾缺少了一個冒號。 所以,改變:

def RegFunction(self, name)

至:

def RegFunction(self, name): # colon added at end

快樂編碼!

您調用的不是 function 條目,而是 function 的結果。 不帶括號試試:

button1 = ttk.Button(self, text="Registration", command=self.RegFunction(name_var))

此外,RegFunction 缺少冒號:

def RegFunction(self, name):
        print(name) 

command=self.RegFunction(name_var.get())將立即執行self.RegFunction() 您需要使用 lambda:

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

        name_var = tk.StringVar()

        name_entry = ttk.Entry(self, textvariable=name_var)
        name_entry.grid(row=1, column=1)

        button1 = ttk.Button(self, text="Registration", command=lambda: self.RegFunction(name_var.get()))
        button1.grid(row=4, column=4)

    def RegFunction(self, name):
        print(name) 

請注意,您的代碼沒有在__init__()中調用super().__init__(parent) ) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM