【问题标题】:for i in -loop with Entry widgetfor i in -loop 与 Entry 小部件
【发布时间】:2016-09-10 06:25:28
【问题描述】:

试图掌握 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))

【问题讨论】:

  • 你能显示课程的其余部分,或者至少显示标题和__init__吗?
  • 是的,我已经更新了原帖。

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


【解决方案1】:

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

但是,当您进行迭代时,您会继续在 Entry 小部件的最后一个索引处将内容插入到 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 *
  • 对于小脚本,这不是什么大问题,但是当您开始扩展程序时,很容易出现导入冲突/意外行为,并且通常更难跟踪事物/调试。

    例如- 如果我们使用了import tkinter as some_name 并且我们使用了some_name.*,其中* 将是您想要使用的tkinter 中的任何内容,例如上面的tk.END,甚至是小部件类,它更容易跟踪。我们确切地知道一切的来源。

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

    【讨论】:

    • 你完全正确。我没有从上次条目中“清理”。太感谢了 !另外,谢谢你的提示。对 python 和编程还是很陌生。
    猜你喜欢
    • 1970-01-01
    • 2022-12-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2022-12-02
    相关资源
    最近更新 更多