Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何在给定名称的字符串的情况下动态访问对象_Python 3.x_Tkinter_Tkinter Entry - Fatal编程技术网

Python 3.x 如何在给定名称的字符串的情况下动态访问对象

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

我希望控制Tkinter条目小部件中的键入,使其仅包含数值。 我在这方面看到了很多问题,没有一个能回答我的实际问题。(对不起,如果我错过了正确的一个…) 我有一些与绑定有关的东西,但无法处理用户会一直按下某个键的情况。所以我决定去valide,当我用名字访问一个对象时,我被阻止了。我想这将是一个问题,我可能会再次遇到,所以寻找一个解决办法

[编辑2:不同框架的代码示例更适合我的实际结构]

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()