2017-02-17 3 views
0

私は名前フィールドを持つクラスポートを持っています。 次に、新しいポートを入力するためのフォームを開くメインウィンドウがあります。このフォームには、最初の行にボタンがあり、これを押すと、新しいポートの名前を入力できる新しいポートがフレームに追加されます。Python - Tkinter。私のtkinterエントリがリストの最後の変数に接続しないのはなぜですか?

入力ボックスのtextvariable私は最後のポートの名前に接続しました。 port-listですが、Printボタンを押すと正しい名前が表示されません。

私が望むよう

MAIN_interface_pkg(root) 

にライン

MAIN_gui = MAIN_GUI(root) 

を変更すると、それが動作する場合。

それはあなたがあなたのコード内で二回Tk()を呼び出している

#!/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()   

答えて

2

...そう悪いコーディングといくつかの見落としを持ってくださいPythonとTkinterを持つ私にとって初めての試みです。この結果、2つの完全に別々のTkインスタンスが実行され、それぞれに独自の変数セットがあります。ここでは正確なルールはわかりませんが、ご使用のStringVar()が別のインスタンスで作成されていることは明らかです。

Tkinterアプリケーションで複数のウィンドウを作成するには、1つを除くすべてのウィンドウにToplevel()を使用する必要があります。

関連する問題