Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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-Tkinter。为什么';我的tkinter条目是否连接到列表中的最后一个变量?_Python_Tkinter - Fatal编程技术网

Python-Tkinter。为什么';我的tkinter条目是否连接到列表中的最后一个变量?

Python-Tkinter。为什么';我的tkinter条目是否连接到列表中的最后一个变量?,python,tkinter,Python,Tkinter,我有一个类端口,它有一个名称字段。 然后,我有一个主窗口,打开一个表单以输入新端口。此表单的第一行有一个按钮,按下该按钮时,会将一个新端口添加到框架中,您可以在其中输入新端口的名称等 输入框的textvariable我已连接到端口列表中最后一个端口的名称,但是当我按下“打印”按钮时,它不会打印正确的名称 如果换线 MAIN_gui = MAIN_GUI(root) 到 然后它就可以按我的要求工作了 这是我第一次尝试使用Python和Tkinter,所以请注意一些错误的编码 #!/usr/bin

我有一个类端口,它有一个名称字段。 然后,我有一个主窗口,打开一个表单以输入新端口。此表单的第一行有一个按钮,按下该按钮时,会将一个新端口添加到框架中,您可以在其中输入新端口的名称等

输入框的textvariable我已连接到端口列表中最后一个端口的名称,但是当我按下“打印”按钮时,它不会打印正确的名称

如果换线

MAIN_gui = MAIN_GUI(root)

然后它就可以按我的要求工作了

这是我第一次尝试使用Python和Tkinter,所以请注意一些错误的编码

#!/usr/bin/env python
import Tkinter as tk
MAIN_VERSION='3.6e'

class Port:
    def __init__(self, name, mode, direction):
        self.name = tk.StringVar()
        self.name.set(name)
        self.mode= tk.StringVar()
        self.mode.set(mode)
        self.direction= tk.StringVar()
        self.direction.set(direction)

def quit():
    root.destroy()

class MAIN_GUI(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self,parent)
        frame = tk.Frame(parent)
        frame.pack(expand='0', fill='x')
        frame_buttons = tk.Frame(frame, borderwidth='1', relief='groove')
        frame_buttons.pack(side=tk.TOP)
        frame_quit = tk.Frame(frame, borderwidth='1', relief='groove')
        frame_quit.pack(side=tk.TOP)

        ################
        label = tk.Label(frame, text="MAIN Gui version "+MAIN_VERSION)
        label.pack(side=tk.TOP)
        ################
        quit_button = tk.Button(frame_quit, text="QUIT", fg="red", command=root.quit)
        quit_button.pack(side=tk.TOP)
        intf_button = tk.Button(frame_buttons, text="Create Interface Package", command=self.intf_button_action)
        intf_button.pack(side=tk.LEFT)

    def intf_button_action(self):
        global MAIN_interface_pkg_window
        if MAIN_interface_pkg_window is None:
            MAIN_interface_pkg_window = tk.Tk()
            MAIN_interface_pkg = MAIN_INTERFACE_PKG(MAIN_interface_pkg_window)
        else:
            MAIN_interface_pkg_window.update()
            MAIN_interface_pkg_window.deiconify()

class MAIN_INTERFACE_PKG(tk.Frame):
    def __init__(self, parent):
        self.ports = []
        self.main_frame = tk.Frame(parent)
        self.main_frame.pack()
        self.frame_button = tk.Frame(self.main_frame)
        self.frame_button.pack(side=tk.BOTTOM)
        self.print_button = tk.Button(self.frame_button, text="Print", fg="blue", command=self._dbg)
        self.print_button.pack(side=tk.TOP)
        self.frame_three = tk.Frame(self.main_frame, borderwidth=3, relief="groove")
        self.frame_three.pack(side=tk.TOP)
        self._addport(self.frame_three)        
    def _dbg(self):
        for port in self.ports:
            print("DBG:" + str(port.name.get()) + " - " + port.mode.get())

    def _addport(self,frame):
        tmp_port = Port("name", "Two", "Input")
        self.ports.append(tmp_port)
        self.frame_addport = tk.Frame(frame)
        self.frame_addport.pack(side=tk.TOP)
        if (len(self.ports) == 1):
            self.button_portname = tk.Button(self.frame_addport, text = "[+] Port Name:", width=12, command=lambda:self._addport(frame))
            self.button_portname.pack(side=tk.LEFT)
        else:
            self.label_portname = tk.Label(self.frame_addport, text = "    Port Name:", width=14)
            self.label_portname.pack(side=tk.LEFT, padx=4)
        self.e = tk.Entry(self.frame_addport, textvariable=self.ports[-1].name)
        self.e.pack(side=tk.LEFT)
        for text in ["One", "Two", "Three", "Four"]:
            self.b = tk.Radiobutton(self.frame_addport, text=text,
                            variable=self.ports[-1].mode, value=text)
            self.b.pack(side=tk.LEFT)

root=tk.Tk()

MAIN_interface_pkg_window = tk.Tk()
MAIN_interface_pkg = MAIN_INTERFACE_PKG(MAIN_interface_pkg_window)
MAIN_interface_pkg_window.withdraw()
MAIN_gui= MAIN_GUI(root)
root.mainloop()        
您在代码中调用了两次
Tk()
。这将导致两个完全独立的Tk实例运行,每个实例都有自己的变量集。我不确定这里的确切规则,但显然您的
StringVar()
s是在不同的实例中创建的,而不是在使用它们

要在Tkinter应用程序中创建多个窗口,您必须对其中一个窗口以外的所有窗口使用
Toplevel()

您在代码中调用了两次
Tk()
。这将导致两个完全独立的Tk实例运行,每个实例都有自己的变量集。我不确定这里的确切规则,但显然您的
StringVar()
s是在不同的实例中创建的,而不是在使用它们

要在Tkinter应用程序中创建多个窗口,您必须对所有窗口使用
Toplevel()
,只有一个窗口除外

#!/usr/bin/env python
import Tkinter as tk
MAIN_VERSION='3.6e'

class Port:
    def __init__(self, name, mode, direction):
        self.name = tk.StringVar()
        self.name.set(name)
        self.mode= tk.StringVar()
        self.mode.set(mode)
        self.direction= tk.StringVar()
        self.direction.set(direction)

def quit():
    root.destroy()

class MAIN_GUI(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self,parent)
        frame = tk.Frame(parent)
        frame.pack(expand='0', fill='x')
        frame_buttons = tk.Frame(frame, borderwidth='1', relief='groove')
        frame_buttons.pack(side=tk.TOP)
        frame_quit = tk.Frame(frame, borderwidth='1', relief='groove')
        frame_quit.pack(side=tk.TOP)

        ################
        label = tk.Label(frame, text="MAIN Gui version "+MAIN_VERSION)
        label.pack(side=tk.TOP)
        ################
        quit_button = tk.Button(frame_quit, text="QUIT", fg="red", command=root.quit)
        quit_button.pack(side=tk.TOP)
        intf_button = tk.Button(frame_buttons, text="Create Interface Package", command=self.intf_button_action)
        intf_button.pack(side=tk.LEFT)

    def intf_button_action(self):
        global MAIN_interface_pkg_window
        if MAIN_interface_pkg_window is None:
            MAIN_interface_pkg_window = tk.Tk()
            MAIN_interface_pkg = MAIN_INTERFACE_PKG(MAIN_interface_pkg_window)
        else:
            MAIN_interface_pkg_window.update()
            MAIN_interface_pkg_window.deiconify()

class MAIN_INTERFACE_PKG(tk.Frame):
    def __init__(self, parent):
        self.ports = []
        self.main_frame = tk.Frame(parent)
        self.main_frame.pack()
        self.frame_button = tk.Frame(self.main_frame)
        self.frame_button.pack(side=tk.BOTTOM)
        self.print_button = tk.Button(self.frame_button, text="Print", fg="blue", command=self._dbg)
        self.print_button.pack(side=tk.TOP)
        self.frame_three = tk.Frame(self.main_frame, borderwidth=3, relief="groove")
        self.frame_three.pack(side=tk.TOP)
        self._addport(self.frame_three)        
    def _dbg(self):
        for port in self.ports:
            print("DBG:" + str(port.name.get()) + " - " + port.mode.get())

    def _addport(self,frame):
        tmp_port = Port("name", "Two", "Input")
        self.ports.append(tmp_port)
        self.frame_addport = tk.Frame(frame)
        self.frame_addport.pack(side=tk.TOP)
        if (len(self.ports) == 1):
            self.button_portname = tk.Button(self.frame_addport, text = "[+] Port Name:", width=12, command=lambda:self._addport(frame))
            self.button_portname.pack(side=tk.LEFT)
        else:
            self.label_portname = tk.Label(self.frame_addport, text = "    Port Name:", width=14)
            self.label_portname.pack(side=tk.LEFT, padx=4)
        self.e = tk.Entry(self.frame_addport, textvariable=self.ports[-1].name)
        self.e.pack(side=tk.LEFT)
        for text in ["One", "Two", "Three", "Four"]:
            self.b = tk.Radiobutton(self.frame_addport, text=text,
                            variable=self.ports[-1].mode, value=text)
            self.b.pack(side=tk.LEFT)

root=tk.Tk()

MAIN_interface_pkg_window = tk.Tk()
MAIN_interface_pkg = MAIN_INTERFACE_PKG(MAIN_interface_pkg_window)
MAIN_interface_pkg_window.withdraw()
MAIN_gui= MAIN_GUI(root)
root.mainloop()