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:
我正在做一个扩展项目作为我目前大学的资格之一,我选择编写一个 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: