Python 3.x 如何在给定名称的字符串的情况下动态访问对象
我希望控制Tkinter条目小部件中的键入,使其仅包含数值。 我在这方面看到了很多问题,没有一个能回答我的实际问题。(对不起,如果我错过了正确的一个…) 我有一些与绑定有关的东西,但无法处理用户会一直按下某个键的情况。所以我决定去valide,当我用名字访问一个对象时,我被阻止了。我想这将是一个问题,我可能会再次遇到,所以寻找一个解决办法 [编辑2:不同框架的代码示例更适合我的实际结构]Python 3.x 如何在给定名称的字符串的情况下动态访问对象,python-3.x,tkinter,tkinter-entry,Python 3.x,Tkinter,Tkinter Entry,我希望控制Tkinter条目小部件中的键入,使其仅包含数值。 我在这方面看到了很多问题,没有一个能回答我的实际问题。(对不起,如果我错过了正确的一个…) 我有一些与绑定有关的东西,但无法处理用户会一直按下某个键的情况。所以我决定去valide,当我用名字访问一个对象时,我被阻止了。我想这将是一个问题,我可能会再次遇到,所以寻找一个解决办法 [编辑2:不同框架的代码示例更适合我的实际结构] import tkinter as tk from NumFormat import * class Sa
import tkinter as tk
from NumFormat import *
class SampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self._frame = None
self.switch_frame(StartPage)
def switch_frame(self, frame_class):
new_frame = frame_class(self)
if self._frame is not None:
self._frame.destroy()
self._frame = new_frame
self._frame.pack()
class StartPage(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
tk.Label(self, text="This is the start page").pack(side="top", fill="x", pady=10)
tk.Entry(self, validate="key", validatecommand=(self.register(NumHandler.NumValidate),
'%S', '%W', '%s')).pack()
tk.Button(self, text="Open page one",
command=lambda: master.switch_frame(PageOne)).pack()
tk.Button(self, text="Open page two",
command=lambda: master.switch_frame(PageTwo)).pack()
class PageOne(tk.Frame):
def __init__(self, master):
tk.Frame.__init__(self, master)
tk.Label(self, text="This is page one").pack(side="top", fill="x", pady=10)
tk.Entry(self, validate="key", validatecommand=(self.register(NumHandler.NumValidate),
'%S', '%W', '%s')).pack()
tk.Button(self, text="Return to start page",
command=lambda: master.switch_frame(StartPage)).pack()
if __name__ == "__main__":
app = SampleApp()
app.mainloop()
在第二个模块中(本例中称为NumFormat):
如您所见,在处理数字格式的函数中访问帧名称的方法也可以是字符串。我的问题是:如何通过名称访问对象
我显然有一条错误消息,因为在NumValidate函数中使用“register”,“Myentry”变量是字符串,而不是对象
你知道怎么解决这个问题吗
谢谢大家,使用
root.nametowidget()
方法
然而,看起来是时候让你跳进自己制作课程的世界了
import tkinter as tk
class Jacques(tk.Entry):
def __init__(self, master=None, **kwargs):
super().__init__(master, **kwargs)
cmd = (self.register(self.NumValidate), '%S', '%s')
self.config(validate="key", validatecommand=cmd)
def NumValidate(self, keycode, valuetocheck):
if keycode in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]:
return True
if keycode in [",", "."] and len(valuetocheck) == 1:
self.delete(0, 'end')
self.insert(0, "0.")
return False
if keycode in [",", "."] and "." in valuetocheck[:-1]:
return False
if keycode in [".", ","]:
self.delete(0, "end")
self.insert(0, valuetocheck[:-1] + ".")
return False
return False
root = tk.Tk()
myEntry = Jacques(root, width=40)
myEntry.pack()
root.mainloop()
谢谢你的回答,是的,我想是时候考虑一下这些解决方案了!我将看看如何在实际代码中实现这一点。(frames已经是其他类调用的类,但猜测不会成为问题)我现在是初学者,一个接一个地解决问题,无法看到整个画面。@juanpa.arrivillaga:公平地说,tkinter小部件确实有名字。它们通常隐藏在视图之外,但基本上每个小部件都有一个唯一的名称。这意味着什么:“因为我也只能通过它的名称访问我的框架”?您的代码中没有框架。请一次只问一个问题。首先,您询问了如何访问条目小部件,然后编辑了问题以询问是否关闭了验证。问一个或另一个,但不要同时问两个。是的,如果您更改验证函数中的值,则验证将被关闭。@BryanOakley因这些问题而著名。我会继续用它的名字访问它!当我说我可以通过名称访问框架时,这是因为我可能有不同的框架,因此框架的名称也必须是动态的。由于我缺乏知识,为了尽可能简洁,我将我的示例放在一个“根”框架中,但实际上它可以是root1、root2、root3。。。如果我想通过register将它传递到函数中,它也会变成一个字符串。窗口本身通常不称为框架。如果您需要根窗口,有一种方法可以在给定任何其他小部件的情况下获得它。
import tkinter as tk
class Jacques(tk.Entry):
def __init__(self, master=None, **kwargs):
super().__init__(master, **kwargs)
cmd = (self.register(self.NumValidate), '%S', '%s')
self.config(validate="key", validatecommand=cmd)
def NumValidate(self, keycode, valuetocheck):
if keycode in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]:
return True
if keycode in [",", "."] and len(valuetocheck) == 1:
self.delete(0, 'end')
self.insert(0, "0.")
return False
if keycode in [",", "."] and "." in valuetocheck[:-1]:
return False
if keycode in [".", ","]:
self.delete(0, "end")
self.insert(0, valuetocheck[:-1] + ".")
return False
return False
root = tk.Tk()
myEntry = Jacques(root, width=40)
myEntry.pack()
root.mainloop()