for in -loop with Entry widget

时间:2016-05-13 22:51:21

标签: python-3.x for-loop tkinter

尝试获取tkinter,小部件和邻近区域。 继续收到错误 - 谷歌搜索后,不会弹出答案。

由于某种原因,这个循环显示了输入行中的所有文件名 - 而不是一次一个... - 我做错了什么?

感谢您的帮助!

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

1 个答案:

答案 0 :(得分:0)

您似乎希望您的条目窗口小部件在迭代时一次显示os.listdir的内容,并在每次迭代时更改条目窗口小部件值。

但是,当你在迭代时,你会继续在Entry小部件的最后一个索引处插入条目小部件。你永远不会删除Entry小部件的内容,所以你只看到这是一个大文本网格。

坚持使用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 *
  • 使用小脚本,这不是什么大问题,但是当你开始扩展你的程序时,很容易发生冲突导入/意外行为,一般来说,跟踪事情/调试变得更加困难。

    e.g。 - 如果我们执行了import tkinter as some_name并且我们使用了some_name.*,其中*将来自tkinter,您想要使用如上所述的tk.END,甚至是小部件类,它会更容易保持对...的跟踪。我们知道完全所有内容都来自。

  • 阻止Tk的主要事件循环
  • 如果你有一个大目录,那么这样的迭代将阻止Tk的主事件循环。请考虑使用单独的线程。