jf...@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). -- https://mail.python.org/mailman/listinfo/python-list