HELP: Tkinter idiom needed: SOLUTION

Pekka Niiranen pekka.niiranen at wlanmail.com
Mon Jan 3 14:41:41 EST 2005


Hi there,

got it. Note the root.distroy()-command.

-pekka-

----- CODE STARTS ----

from Tkinter import *
from ScrolledText import ScrolledText
import tkFont

class Message_box:
     # Graphical message box for printing unicode texts

     def __init__(self, myParent):
         self.myContainer1 = Frame(myParent)
         self.myContainer1.pack(side=TOP, expand=1, fill=BOTH)
         self.button1 = Button(self.myContainer1)
         self.button1["text"]= "Close"
         self.button1.pack(side=BOTTOM)
         self.button1.bind("<Button-1>", self.button1Click)
         self.font = tkFont.Font(family="Arial Unicode MS", size=8)
         self.text = ScrolledText(self.myContainer1, font=self.font,\
			 state=NORMAL, height=40, width=120, wrap=NONE)
         self.text.pack(side=TOP, expand=1, fill=BOTH)

     def button1Click(self, event):
         self.myContainer1.quit()

     def write(self,s):
         self.text.insert(END, s)

     def enable_write(self):
         self.text.config(state=NORMAL)

     def disable_write(self):
         self.text.config(state=DISABLED)


if __name__ == '__main__':
	# first window
	root = Tk()
	print "blah1"
	root.title(' Message window')
	root.protocol("WM_DELETE_WINDOW", NONE)
	widget = Message_box(root)
	m = "blah2"
	widget.write("%s\n" % m)
	widget.disable_write()	
	root.mainloop()
	root.destroy()
	print "blah3"
	# second window
	root = Tk()
	root.title(' Message window')
	root.protocol("WM_DELETE_WINDOW", NONE)
	widget = Message_box(root)
	m = "blah4"
	widget.write("%s\n" % m)
	widget.disable_write()	
	root.mainloop()
	root.destroy()
	print "blah5"

----- CODE ENDS ----

Pekka Niiranen wrote:
> Hi there,
> 
> after reading TkInter/thread -recipe:
> http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/82965
> I wondered if it was possible to avoid using threads
> for the following problem:
> 
> I have script started from W2K console that normally
> prints ascii messages to the screen. However, I have
> command line "debug" -flag that might cause printing
> of UTF-8 data to the screen. This fails occassionally
> due to Console encoding, of course.
> 
> What I need is Tkinter window where some printouts
> are directed when script is run in Debug -mode
> (Redirection of stdout is out of question).
> 
> While testing, I have got this far already:
> 
> ---script starts----
> 
> from Tkinter import *
> from ScrolledText import ScrolledText
> import os, sys, tkFont, codecs
> 
> class Pyg_message_box:
>   def __init__(self, parent):
>     self.myParent = parent
>     self.myContainer1 = Frame(parent)
>     self.myContainer1.option_add("*font",\
>     tkFont.Font(family="Arial Unicode MS", size=8))
>     self.myContainer1.pack()
>     self.text = ScrolledText()
>     self.text.pack()
>     self.button1 = Button(self.myContainer1, text="Quit",\
>              command=self.button1Click)
>     self.button1.pack(side=LEFT)
>     self.button1.bind("<Button-1>", self.button1Click)
> 
>   def button1Click(self, event):
>      self.myContainer1.quit()
> 
>   def write(self, s):
>     self.text.insert(END, s)
> 
> root = Tk()
> widget = Pyg_message_box(root)
> sys.stdout = widget
> a = codecs.open("d:\\test.txt", "r", "utf_16").readlines()
> for x in a:
>   print x
> root.mainloop()
> 
> ---script ends----
> 
> My questions are:
> - Can I open Tk -window without enclosing the whole script
>   between "root=Tk()" and "root.mainloop()"?
> - What is the idiom of opening Tk -window only when Debug -flag
>   is encountered (the script stops running until window is closed)?
> 
> Something like:
> 
> if not my_debug == "ON":
>     print "message" # prints to console
> else:
>     # 1) open temporary ScrolledText() Tk -window
>     # 2) Print stuff to window
>     # 3) Ask user to close window
> 
> I would no like to always open Tkwindows just in case user runs script
> with debug -flag on.
> 
> -pekka-



More information about the Python-list mailing list