python response slow when running external DLL
Peter Otten
__peter__ at web.de
Fri Nov 27 07:20:03 EST 2015
jfong at ms4.hinet.net wrote:
> Peter Otten at 2015/11/27 UTC+8 5:19:17 PM wrote:
>
> Hi! Peter, thanks for your prompt reply.
>
>> What does var_status.set() do? If it writes to stdout you may just need
>> to flush().
>
> var_status is a StringVar which binds to a lable's textvariable. I use
> this label as the status bar to show message.
Can I conclude from the above that you are using tkinter? Widgets can only
update when the event loop gets a chance to run. While a quick fix is to
invoke update_idletasks() callbacks shouldn't generally contain long-running
code that -- as you have seen -- will block the complete user interface.
>> Do you see the same behaviour when you replace mydll.SayHello() with
>> something simple like time.sleep(1)?
>
> I use time.sleep(3) to replace mydll.SayHello(), still get the same.
>
>> As a general remark keep your test scripts as simple as possible.
>> Example: If
>>
>> import mydll
>> print("Download...", end="")
>> mydll.SayHello()
>> print("OK")
>>
>> showed the same behaviour it would be the ideal test script.
>
> I run the above statements in a test file, it works as expected. I can
> see "Download..." and then "OK".
>
>
Quick-fix example:
#!/usr/bin/env python3
import tkinter as tk
import time
def download():
var.set("Starting download...")
root.update_idletasks()
time.sleep(3)
var.set("... done")
root = tk.Tk()
var = tk.StringVar()
label = tk.Label(root, textvariable=var)
label.pack()
button = tk.Button(root, text="Download", command=download)
button.pack()
root.mainloop()
A cleaner solution can indeed involve threads; you might adapt the approach
from <http://effbot.org/zone/tkinter-threads.htm> (Python 2 code).
More information about the Python-list
mailing list