Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 将进度更新与Python2.7中的tkinter集成_Python 2.7_Tkinter_Status - Fatal编程技术网

Python 2.7 将进度更新与Python2.7中的tkinter集成

Python 2.7 将进度更新与Python2.7中的tkinter集成,python-2.7,tkinter,status,Python 2.7,Tkinter,Status,因为我在前面的帖子中找不到合适的解决方案或有用的想法,所以我将尝试直接询问 我正在编写一个用python 2.7下载和处理地理数据的脚本。我的主代码运行良好,但由于不同的雇主应该能够使用我的工具,我需要一个适当的接口。我不想使用pyQt,因为afaik必须单独安装,不能通过简单导入.py文件来使用 所以我开始使用tkinter 现在,我的工具可以由一个简单的gui控制,它允许用户输入或更改三个文本变量,单击开始和退出按钮,并读取带有(目前)静态文本的状态栏 因此,如果用户点击“开始”按钮,主进程

因为我在前面的帖子中找不到合适的解决方案或有用的想法,所以我将尝试直接询问

我正在编写一个用python 2.7下载和处理地理数据的脚本。我的主代码运行良好,但由于不同的雇主应该能够使用我的工具,我需要一个适当的接口。我不想使用pyQt,因为afaik必须单独安装,不能通过简单导入.py文件来使用

所以我开始使用tkinter

现在,我的工具可以由一个简单的gui控制,它允许用户输入或更改三个文本变量,单击开始和退出按钮,并读取带有(目前)静态文本的状态栏

因此,如果用户点击“开始”按钮,主进程(完成所有下载和转换工作)开始

我现在想做的是修改静态状态栏,并进行进度更新,如“下载文件10/20”或“将文件11转换为要素类/形状文件”

我还不太熟悉tkinter或任何类型的gui,所以我需要一些关于如何构造tkinter代码的建议

import os
import urllib
import arcpy
from Tkinter import *

def start():
    mainpath= e0.get()
    if not os.path.exists(mainpath+"\\subfolder\\a1"):
        os.makedirs(mainpath+"\\subfolder\\a1")
        os.makedirs(mainpath+"\\subfolder\\a2")
        os.makedirs(mainpath+"\\subfolder\\a3")
        os.makedirs(mainpath+"\\subfolder\\a4")
    else:
        print "folder a1 already exists"

    DOWNLOADS_DIR = mainpath + "\\subfolder\\a3"
    targetsite= e1.get()
    searchstring= e2.get()   

######################################

#now here the downloading and processing is done
#for example:

if not os.path.isfile(filename):
    print "starting download "+element
    urllib.urlretrieve(element, filename)

    # I want to return a status like below to the status bar in the GUI
    status_string = 'downloading file ' + str(i)+ ' from' + str(count) 
    status.set(status_string)
######################################


master = Tk()
Label(master, text="working directory: ").grid(row=0)
Label(master, text="URL: ").grid(row=1)
Label(master, text="searchstring: ").grid(row=2)

mainpathstring = StringVar(master, value='D:\project')
e0 = Entry(master, textvariable=mainpathstring, width="50")

linkstring = StringVar(master, value='http://thedefaultwebsite.com')
e1 = Entry(master, textvariable=linkstring, width="50")

searchstring = StringVar(master, value='coordinates')
e2 = Entry(master, textvariable=searchstring, width="50")

e0.grid(row=0, column=1)
e1.grid(row=1, column=1)
e2.grid(row=2, column=1)

Button(master, text='quit', command=master.quit).grid(row=3, column=0, sticky=W, pady=4)
Button(master, text='start', command=start).grid(row=3, column=1, sticky=W, pady=4)

status= Label(master, text="working on: nothing", bd=1, relief=SUNKEN, anchor=W).grid(row=4, column=0, columnspan=3)

mainloop( )
应如何处理这一问题?
我在哪里可以找到可以玩弄的好例子?

在回答这些问题时,有很多好的例子。一些是我写的,很多是布莱恩·奥克利和其他人写的

Tkinter代码可以像您所做的那样,以命令式代码、顶级函数定义和其他语句的形式构造,或者以OO代码、类定义和最小顶级代码的形式构造。你会看到这两个例子

状态更新的具体答案是带有StringVar textvariable的标签。更新textvariable会更新显示。下面说明了这个想法。(这是Python 3代码,将Python 2的“tkinter”更改为“tkinter”。)

for
循环、
.update
,尤其是
.sleep
仅用于此示例

您没有明确说明您是否关心在下载过程中保持GUI的响应性。使用
root.after
一次下载一个文件是最简单、最简单的方法。然后,GUI将在每次下载后处理累积的事件。在SO答案中有许多使用
.after
的好例子


更高级的是在单独的线程中下载文件。在*nix上,tk有一个函数来实现这一点,这使它变得非常简单。对于Windows,我会在别处寻找一个预先编写的函数。

ttk
有一个进度条小部件查找infoI,我已经用这个模块进行了实验,但我认为它是为进度条设计的……我想不出一种方法来预先计算我的脚本将花费@Steven Summer的时间。你能确定要下载的文件总数吗?如果不是的话,我怀疑你能下载20个文件中的第10个。你没有可以执行
len(file\u list)
以获取项目数量的列表吗?如果你开始在主线程中下载,那么它将停止mainloop,小部件将无法工作。顺便说一句:两种progressbars@Steven Summers的完整工作示例:是的,我搜索html代码并生成有效链接列表。通过这种方式,我创建了一个链接列表,长度由您提到的len函数确定。稍后,我将遍历该列表。我想我可以调用一个函数,从那里更新状态……这可能吗?根据文件大小,处理时间会有所不同,因此进程栏没有太大意义。。。
import time
import tkinter as tk
root = tk.Tk()
current = tk.StringVar(root)  # initial value ''
status = tk.Label(root, textvariable=current)
status.pack()
for i in range(1, 4):
    current.set('downloading file %d' % i)
    root.update()
    time.sleep(1)
current.set('downloading done')