1

好的,所以我有这个 python 脚本,它可以从多个文件中复制文本并将其粘贴到具有不同文件扩展名的新文件中。它几乎完成了,但是我的刷新按钮有问题。

要使用它,只需将一些文件放在“输入”目录中,运行程序即可。

如果用户在“输入”文件夹中没有文件的情况下运行程序,看到文件计数为零,然后将一些文件放入文件夹中,我希望重新加载 file_count 变量。

目前,我有一个名为“refresh()”的函数,它打开程序的另一个实例,然后关闭初始实例。这行得通,但是因为 'os.startfile' 不是为此用途而设计的,所以它有一些问题:

首先,当然,重新启动整个程序似乎有点矫枉过正。

其次,“os.startfile”仅适用于 Windows。

第三,如果窗口被移动,然后程序被“刷新”,新实例将在默认位置打开。

那么无论如何要重新运行'file_count'变量吗?

PS。我是自学成才,所以我的知识存在差距(显然,这是其中之一。)PPS。马上要开始讲课了,所以我只能在一个小时内回复。

import sys
import os, os.path
from os import listdir
import shutil
from Tkinter import *
from Tkinter import Tk
from tkFileDialog import askopenfilename

path, dirs, files = os.walk(os.path.join(os.getcwd(), 'Input')).next()
file_count = len(files)
dirList = os.listdir(path)

def refresh():
    opencp = os.startfile(os.path.join(os.getcwd(), 'Copy_Paster.py'))
    closecp = os.execl(sys.executable, *([sys.executable]+sys.argv))

def copy_paste():
    # Copy pastes text from source documents to new ones.
    for fname in dirList:
      print fname
      extension = text_entered.get()
      copy = open(os.path.join(os.getcwd(), 'Input', fname), "r")
      paste = open(os.path.join(os.getcwd(), 'Output', fname + extension), "w+")
      copy.seek(0)
      shutil.copyfileobj(copy,paste)
      copy.close()
      paste.close()

# Window Geometry
width = "250"
height = "70"

# Window
root = Tk()
root.geometry(width+"x"+height+"+500+200",)
root.resizable(0,0)
root.title("Copy Paster")
text_entered = StringVar()

counter = Label(text="Input Directory: " + str(file_count) + " files.")
counter.place(x=int(width)-248,y=int(height)-63)

refresh = Button(root,command=refresh,text="Refresh")#Why this no work?
refresh.place(x=int(width)-80,y=int(height)-65, width=70)


format_label = Label(text="Output File Format:")
format_label.place(x=int(width)-248,y=int(height)-35)
document_type = Entry(root, textvariable=text_entered)
document_type.place(x=int(width)-135,y=int(height)-33, width=40)

convert = Button(root,command=copy_paste,text="GO!")
convert.place(x=int(width)-80,y=int(height)-35, width=70)

root.mainloop()
4

1 回答 1

2

在你的refresh函数中,为什么你不能只重新计算file_count变量?我怀疑您还需要刷新一些其他变量。可能是这样的:

def refresh():
    global path,dirs,files,file_count,dirList
    path, dirs, files = os.walk(os.path.join(os.getcwd(), 'Input')).next()
    file_count = len(files)
    dirList = os.listdir(path)

但是,要让您的标签刷新,您需要做更多的事情。根据effbot.org 上的 Tkinter 文档

您可以将 Tkinter 变量与标签相关联。当变量的内容发生变化时,标签会自动更新:

为此,您需要以不同的方式设置标签。

file_count_string = StringVar()
counter = Label(textvariable=file_count_string)
counter.pack()
file_count_string.set("Input Directory: " + str(file_count) + " files.")

当您想刷新该标签时:

file_count_string.set("Input Directory: " + str(file_count) + " files.")
于 2013-05-08T08:02:47.500 回答