tkinter 按钮 return 可以从单击条目中获取值吗?

Can a tkinter button return a value from an entry on-click?

我正在做一个扩展项目作为我目前大学的资格之一,我选择编写一个 python Strategy/RPG 游戏。结果,我最终获得了最高水平的 Python 知识(超过了我的计算机老师,他只使用过基础知识......并且几年前只使用过一次 Tkinter。每个决定制作的人一个程序,要么在 Lua、Java、C++、HTML/CSS/Java-Script 中编码,要么在 python 中编码,他们只是使用从我们老师那里学到的基础知识。 ) 我说 "Highest level of Python knowledge" 但实际上并没有那么高......我只知道一些超出基础知识的知识。 因此,论坛 post 是我寻求帮助的最佳场所。

所以在我的游戏中我定义了这个函数:

#"Given_String" is the question that one would want to ask. (With the answer being an integer between 1 and "Choice_Range" (inclusive)
def Value_Error(Given_String,Error_Message,Choice_Range):
    while True:
        try:
            Temp=int(input(Given_String))
            if Temp<1 or Temp>Choice_Range:
                print(Error_Message)
            else:
                break
        except ValueError:
            print(Error_Message)
    return Temp

然后我想将 tkinter 添加到我的代码中,因为游戏必须在单独的 window 中,而不是在控制台中。因此,我不得不更改此代码,以便它在 tkinter window 中显示 "Given_Message" 和 "Error_Message",并使用在定义时输入到输入框中的值"Temp".

我写了这段代码来完成这项工作:(或至少大部分)

#This code is stored in a different file for neatness and hence I had to import "sys" to avoid circular imports.
#This code is made to be flexible so that I can later re-use it when necessary.
#This code starts with the function all the way at the bottom. The rest are made to add flexibility and to structure the algorithm.
#This code hasn't been fully run (Because of the Error crashing the Python Shell) so it can contain other Run-time Errors that I'm not aware of yet.

import sys
def Generate_Window(Window_Name,X_Parameter=5,Y_Parameter=50):
    Temp=sys.modules['tkinter'].Tk()
    Temp.title(Window_Name)
    Temp.geometry(str(X_Parameter)+"x"+str(Y_Parameter))
    return Temp

def Generate_Button(Master,Text="Submit"):
    Temp=sys.modules["tkinter"].Button(Master,text=Text)
    return Temp

def Generate_Entry(Master):
    Temp=sys.modules["tkinter"].Entry(Master)
    return Temp

def Generate_Label(Master,Given_String):
    Temp=sys.modules["tkinter"].Label(Master,text=Given_String)
    return Temp

def Com_Get_Entry(Given_Window,Given_Entry):
    Temp=Given_Entry.get()
    Given_Window.destroy()
    return Temp

def Com_Confirm(Given_Window):
    Given_Window.destroy()

def Generate_Entry_Box(Given_String):
    Entry_Window=Generate_Window("Entry",X_Parameter=300)
    Entry_Label=Generate_Label(Entry_Window,Given_String)
    Entry_Entry=Generate_Entry(Entry_Window)
    Entry_Button=Generate_Button(Entry_Window)
    Entry_Button.configure(command=lambda:Com_Get_Entry(Entry_Window,Entry_Entry))
    Entry_Label.grid(row=0,columnspan=2)
    Entry_Entry.grid(row=1,column=0)
    Entry_Button.grid(row=1,column=1)

def Generate_Alert_Message(Given_String):
    Alert_Window=Generate_Window("Alert",X_Parameter=300)
    Alert_Label=Generate_Label(Alert_Window,Given_String)
    Alert_Button=Generate_Button(Alert_Window,Text="OK")
    Alert_Button.configure(command=lambda:Com_Confirm(Alert_Window))
    Alert_Label.grid(row=0,columnspan=2)
    Alert_Button.grid(row=1,column=1)

def Get_Interger_Input_In_Range(Given_String,Error_Message,Choice_Range):
    while True:
        try:
            Returned_Value=int(Generate_Entry_Box(Given_String))
            if Returned_Value<1 or Returned_Value>Choice_Range:
                Generate_Alert_Message(Error_Message)
            else:
                break
        except ValueError:
            Generate_Alert_Message(Error_Message)
    return Temp

我已经在我的代码中包含了所有我正在努力解决的问题,并且我可以找到答案。 I.E:单击时,使用给定参数执行特定操作。 我找不到的一件事是如何在单击按钮后将输入的值 return 设置为原始 (Get_Interger_Input_In_Range()) 函数。 我的意思是这样的:

def Function1(GivenParameter1,GivenParameter2):
    Temp=Function2(GivenParameter1)
    Temp+=GiverParameter2   #random action
    return Temp

def Function2(GivenParameter):
    Button=Button(Master,command=Function3).grid()
    Entry=Entry(Master).grid()

def Function3():
    Temp=Entry.get()
    return Temp

在 Function1 中,我希望 Temp 等于从 Function2 输入的值。 有什么方法可以不使用 classes 来做到这一点吗? (我还不太熟悉 classes) 有什么办法可以做到这一点? 我还没有看到任何人给出我正在寻找的答案...... 因为即使他们说要使用 classes... 我仍然不知道如何 return 它(下面的解释)

#The following code was written quickly for purposes of explaining what I mean. It doesn't actually work... (It seems that the button command is being called automatically...)

from tkinter import *
class Return_Value_In_Entry():
    def __init__(self):
        self.Master=Tk()
        self.Entry=Entry(self.Master)
        self.Button=Button(self.Master,text="Submit",command=self.Return())
    def Return(self):
        self.TempVar=self.Entry.get()
        return self.TempVar

在我看来,Return() 函数会 return 按钮的值,而不是调用 class 的 function/assignment ...我的代码也有同样的问题。

如果您阅读了所有内容,那么我真的很感激。我希望有人能回答我的问题并告诉我(如果不可能的话)如何使用 classes 来解决我的 "Little" 大问题。

我修复了您的示例代码(我认为)。主要问题是:

command=self.Return()

并不像你想象的那样。它只是将 Return() 中的 return 值分配给命令。这是不正确的。应该是

command=self.Return

这会将函数 Return 分配给命令。随后,每当按下按钮时,都会执行 self.Return()。

完整示例在这里:

from tkinter import *

class Return_Value_In_Entry():
    def __init__(self):
        self.Master=Tk()

        self.Entry=Entry(self.Master)
        self.Entry.pack()

        self.Button=Button(self.Master,text="Submit",command=self.Return)
        self.Button.pack()            

        self.Master.mainloop()

    def Return(self):
        self.TempVar=self.Entry.get()

        print(self.TempVar)        


Return_Value_In_Entry()  

现在,无论何时按下按钮,输入小部件的值都会保存到 self.TempVar 并打印出来,只是为了检查它是否正常工作。希望这有帮助。

显示示例程序如何工作的 Gif: