我有一个代码,下载在一个在线列表中指定的文件,当这样做的时候,显示一个加载屏幕,一个标签告诉哪个文件正在下载,一个不确定的进度条向用户显示正在发生的事情。下载的效果很好,但是不起作用的是tkinter,它在过程完成之前不起作用,只在最后显示“downloadfinished”标签。如何让tkinter在函数完成之前显示窗口?在
我已经试过了
将其拆分为多个函数
添加一个sleep
函数,看看减慢它是否有帮助
为了展示我所说的,我用一些示例替换了我的原始代码。有人知道如何使tkinter更新更活跃(在函数完成之前)?在
#Imports
import urllib.request as ur
import os
from tkinter import *
import tkinter.ttk as ttk
import time as T
#Globals
tk = None
where = None
progressbar = None
progresstitle = None
progressinfo = None
transfer = None
#Make sure that the download directory exists
def checkdir(filename):
directory = os.path.dirname(filename)
try:
os.stat(directory)
except:
os.mkdir(directory)
#First part (read q to see why I split up)
def part1():
#Get Globals
global tk
global where
global progressbar
global progresstitle
global progressinfo
global transfer
#Create Window
tk = Tk()
tk.title("Downloading...")
#Find out the location of the online files to download by reading the online txt file which contains their locations
where = str(ur.urlopen("http://example.com/whatfilestodownload.txt").read())
where = where[2:(len(where)-1)]
where = where.split(";")
#Create the progress bar
progressbar = ttk.Progressbar(tk, orient=HORIZONTAL, length=200, mode='indeterminate')
progressbar.grid(row = 2, column = 0)
#Create the labels
progresstitle = Label(tk, text = "Downloading Files!", font = ("Helvetica", 14))
progresstitle.grid(row = 0, column = 0)
progressinfo = Label(tk, text = "Starting Download...", font = ("Helvetica", 10))
progressinfo.grid(row = 1, column = 0)
#Engage Part Two
part2()
#Part Two
def part2():
#Get Globals
global tk
global where
global progressbar
global progresstitle
global progressinfo
global transfer
#Repeat as many times as files described in the only file describing .txt
for x in where
#The online file contains "onlinelocation:offlinelocation" This splits them up
x1 = x.split(":")[0]
x2 = x.split(":")[1]
#Read the online file and update labels
transfer = None
progressinfo.config(text = str("Downloading " + x2 + "..."))
transfer = str(ur.urlopen("http://example.com/" + x1).read())
progressinfo.config(text = str("Configuring downloaded file..."))
transfer = transfer [2:(len(transfer)-1)]
#Fix python turning "\n" to "\\n" by reversing
transfer = transfer.split("\\n")
transtemp = ""
for x in transfer:
transtemp = transtemp + "\n" + x
transfer = transtemp[1:len(transtemp)]
progressinfo.config(text = str("Installing " + x2 + "..."))
tw = None
checkdir(str(os.getcwd()+"/Downladed/"+x2))
tw = open(str(os.getcwd()+"/Downloaded/"+x2), "w")
tw.write(transfer)
tw.close()
#See if waiting helps
T.sleep(0.5)
part3()
def part3():
#Get Globals
global tk
global where
global progressbar
global progresstitle
global progressinfo
global transfer
#Final Screen
progressbar.grid_remove()
progressinfo.grid_remove()
progresstitle.config(text="You have downloaded\n the required files!")
progressbar.stop()
part1()
如果在
part2()
函数中下载的每个文件末尾更新显示就足够了,那么可以使用update_idletasks()
方法,用它代替T.sleep()
,这将允许GUI在返回for循环的另一个迭代之间刷新。在参考号:http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.update_idletasks-method
这就是Tcl具有异步I/O功能的原因。您需要及时处理窗口系统事件,这样就不能等待完整的文件下载。相反,你需要把它分成几部分。在Tcl中,我们将使用fileevent命令来设置一个过程,该过程将在每次从套接字获得一些输入时被调用。剩下的时间我们可以处理其他事件。在Python中,实现这一点的常见方法是Twisted包。这允许您使用twisted注册事件源,并使整个应用程序面向事件。您也可以使用线程并在工作线程上下载,但这并不能真正帮助您获得进度通知。有一些特殊的处理将Tkinter和Twisted连接起来-参见documentation。在
相关问题 更多 >
编程相关推荐