2016-05-13 16 views
1

tkinter、widgets、および近隣の領域を手に入れようとしています。 エラーが発生したままになります。for i in -loop in Entry widget

何らかの理由で、このループは、一度に1つではなく、エントリ行にすべてのファイル名を表示します... - 私は間違っていますか?

ありがとうございます!

__author__ = 'Orphan Black' 

import os 
import sys 
from tkinter import * 
from tkinter.scrolledtext import * 
import time 

class PermFrame(Frame): 

    def __init__ (self, master): 
     super(PermFrame, self).__init__(master) 
     self.grid() 
     self.create_widgets() 
     self.createLable() 


     menu = Menu() 
     self.master.config(menu=menu) 


     file = Menu(menu) 
     file.add_command(label="Settings", command=self.setting_menu) 
     file.add_command(label="Exit", command=self.client_exit) 
     menu.add_cascade(label="File", menu=file) 


     about = Menu(menu) 
     about.add_command(label="Info") 
     menu.add_cascade(label="About", menu=about) 

     self.enpath_label = Label(self, text = "Enter path: ") 
     self.enpath_label.grid(row = 2, column = 2, sticky = W, padx=5, pady=5) 

     self.path_ent = Entry(self, width=52) 
     self.path_ent.grid(row = 2, column = 3, sticky = W, padx=5, pady=5) 

     self.sub_bttn = Button(self, text = "Check", command = self.submit_path) 
     self.sub_bttn.grid(row = 2, column = 4, sticky = W, padx=5, pady=5) 

     self.run_bttn = Button(self, text = "Run", command = self.run_prg) 
     self.run_bttn.grid(row = 2, column = 5, sticky = W, padx=5, pady=5) 

     self.orgfn_label = Label(self, text = "Original name: ") 
     self.orgfn_label.grid(row = 4, column = 2, sticky = W, padx=5, pady=5) 

     self.org_filename = Text(self, width=37, height = 1, wrap = WORD) 
     self.org_filename.grid(row=4, column = 3, columnspan = 5, sticky = W, padx=5, pady=5) 

     self.newfn_label = Label(self, text = "New name: ") 
     self.newfn_label.grid(row = 5, column = 2, sticky = W, padx=5, pady=5) 

     self.new_filename = Text(self, width=37, height = 1, wrap = WORD) 
     self.new_filename.grid(row=5, column = 3, columnspan = 5, sticky = W, padx=5, pady=5) 

     self.constxt_label = Label(self, text = "Console ") 
     self.constxt_label.grid(row = 6, column = 2, sticky = W, padx=5, pady=0) 


     self.console_txt = ScrolledText(self, width=71, height = 5, wrap = WORD) 
     self.console_txt.grid(row=7, column = 2, columnspan = 4, sticky = W, padx=5, pady=0) 

    def submit_path(self): 
     # console = console 
     time_date = time.strftime("%H:%M:%S") 
     contents = self.path_ent.get() 
     message = ("\n{}: Trying {}...".format(time_date, contents)) 
     self.console_txt.insert(END, message) 
     try: 
      os.chdir(contents) 
      msgok = ("\n{}: The path {}, is valid".format(time_date, contents)) 
      prg_start = ("\n{}: Program starting...".format(time_date, contents)) 
      self.console_txt.insert(END, msgok) 

     except (ValueError, RuntimeError, TypeError, NameError, FileNotFoundError): 
      notok_mssg= ("\n{}: The path you entered is not valid...Enter a new path".format(time_date)) 
      self.console_txt.insert(END,notok_mssg,) 

    def run_prg(self): 
     os.listdir(self.path_ent.get()) 

     for file in os.listdir(self.path_ent.get()): 
      #print(file) 
      self.org_filename.insert(END,(file)) 
+0

残りのクラス、または少なくともヘッダと '__init__'を表示できますか? –

+0

はい、元の投稿を更新しました。 –

答えて

0

あなたは、エントリウィジェットを使用すると、各反復時にエントリウィジェットの値を変更し、それを反復処理するよう一度にos.listdir 1の内容を表示するように思えます。

しかし、反復処理をしている間は、エントリウィジェットの最後のインデックスにエントリウィジェットを挿入したままにしておきます。 Entryウィジェットの内容を決して削除しないので、これはテキストの大きなメッシュです。エントリウィジェットにこだわっ

...あなたがこれを行うことができます:

self.org_filename.delete(0, END) #Could also use "end" instead of END 
#insert new text 

あなたが望むすべては、この更新テキストの振る舞いである場合、あなたは本当にただのラベルを使用する必要があります。ラベル付きで簡単です。

some_label['text'] = new_filename 

その他の注意事項:

  • あなたはforloopでfile以外の名前を使用する必要がありますキーワード
  • を上書きしないでください。これは組み込みのキーワードです。これを行うたびに、機能を無効にします。小さなスクリプトで

  • 使用しないでくださいインポート*
  • が、それは問題の多くはないのですが、あなたはあなたのプログラムを展開し始めると、それはなり衝突輸入/予期しない動作と、一般的にを持っていることは非常に容易になりますものを追跡するのがずっと難しく、デバッグが難しい。

    - import tkinter as some_nameを実行した場合、を使用しました。ここで、*は、tk.ENDのようなものです。上記のようなtk.ENDや、ウィジェットクラスなども使用したいと思っています。私たちはすべてからを知っています。

  • あなたは大規模なディレクトリが、その後のTkのメインイベントループをブロックします。このように反復している場合のTkのメインイベントループ
  • をブロックします。代わりに別のスレッドを使用することを検討してください。

    +0

    あなたは絶対に正しいです。私は最後のエントリから "クリーン"しなかった。どうもありがとうございます !また、ヒントについてもありがとうございます。まだ非常に新しいpython ...とプログラミングです。 –