Re: [Tutor] Tkinter import error
On Tue, 24 Apr 2007 00:09:21 +0100 Alan Gauld [EMAIL PROTECTED] wrote: John DeStefano [EMAIL PROTECTED] wrote I've run into an error that I've seen reported in several places, but none of the fixes seem to be working for me: when I try to import Tkinter I get a configuration error: Traceback (most recent call last): File stdin, line 1, in module File /usr/local/lib/python2.5/lib-tk/Tkinter.py, line 38, in module import _tkinter # If this fails your Python may not be configured for Tk ImportError: No module named _tkinter Have you specifically selected Tkinter when you compiled the code? I believe you need to set something via configure... Alternatively find an rpm with Tkinter configured already, that should be pretty easy. Usually there is no need to pass extra arguments to configure. My guess is that you missed to install Tcl / Tk and/or the Tcl/Tk development packages before compiling python. Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] list problem
On Wed, 21 Feb 2007 21:21:26 +1300 John Fouhy [EMAIL PROTECTED] wrote: Kirk Bailey wrote: ok, here comes some code: f1=open(pagename,'r') page=f1.readlines() f1.close() at the end of which, the data is in page, which is a list. But something strange is going on here. all the data is in a single cell! it's a one cell list! Say what? Have you tried looking at pagename in a text editor? If readlines() is returning only one line, then you should be able to spot that in the file. Just a guess: if the behavior changed in between Python-2.3 and 2.5 , maybe it is an issue with line endings, LF vs. CR-LF ? Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] same output on diferent sys.stdout.encodings
On Wed, 07 Feb 2007 17:30:26 + Paulino [EMAIL PROTECTED] wrote: Hi everyone! I have some strings that include special characters, to be displayed in widget labels ( PyQt4 ). The output changes in diferent OS's due to diferent sys.stdout encoding Not only the labels in the GUI change, but the source file strings are altered when I move from win to linux and vice-versa. The solution I found for now was to replace the special characters in the source file string for their representation: I replaced é (e acute ) by \xe9 wich correpsond to chr(233) in the cp1252 encoding. The character é (e acute) in linux is not recognized in the source file, neither in IDLE nor in Kate My win sys.stdout.encoding is cp850 and the linux one is utf-8 Now I have d\xe9bito instead of débito (debit in portuguese). By passing the string through unicode with the convinient encoding, I ensure the labels are exibithed the same in every OS but, this way the code is not very readable. Is there a way of solving this, keeping the more readable? ___ Have you tried to declare the encoding in use at the top of your Python source file, like: # -*- coding: iso-8859-1 -*- If you put this at the first line of your .py files (of course replace iso-8859-1 with whatever encoding you use) I think this should do the trick. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Regarding licensing GPL terms
On Wed, 31 Jan 2007 13:34:24 +0530 Anup Rao [EMAIL PROTECTED] wrote: Hi, I am writing an application that uses a python libary (a *.so file) generated using SWIG. This library makes direct system calls to the Linux kernel. This raises three questions. a Does this mean that the library must be distributed under GPL terms? b Can I distribute it as LGPL? c Also, does any python script that uses this module have to be distributed under GPL , LGPL, or is the PSF license sufficient? My preference would be the PSF but I am not sure if it is ok. Hi Anup, maybe it is not the perfect place for this question here :) You could start looking here: http://www.gnu.org/philosophy/license-list.html This page also contains a contact address that seems to be what you need: quote If you want help choosing a license, evaluating a license, or have any other questions about licenses, you can email us at [EMAIL PROTECTED]. /quote I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Can we add labels to tkinter canvas..?
On Mon, 22 Jan 2007 17:47:14 - Alan Gauld [EMAIL PROTECTED] wrote: Asrarahmed Kadri [EMAIL PROTECTED] wrote in message news:[EMAIL PROTECTED] Hello Folks, Is it possible to add a Label to tkinter canvas or i'll need to use create_text method ? What exactly do you expect a label in a canvas to do? Or to look like? You can attach a label to a canvas externally by wrapping them in a single Frame, does that do what you want? Othewise just putting a bit of text onto the canvas itself seems the best bet. What would the lavbel do for you that a bit of text wouldn't? Or put a label (or any other widget) onto the canvas using the create_window() method (though I don't know what's the benefit of a label over some text or image). Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Change the font size of the lines and rectangle on aTkinter Canvas
On Tue, 16 Jan 2007 00:33:20 - Alan Gauld [EMAIL PROTECTED] wrote: Asrarahmed Kadri [EMAIL PROTECTED] wrote I want to provide with a functionality of changing the font size, in this case the width of the lines. Its not really the font size. fonts only apply to text, its only the line width you want to change. However todo that I think the easiest way is just to elete the existing line (and maybe the whole graph) and redraw with the new parameters. Provideed the data has been precalculated then this should be a rapid operation. I am not sure if the OP meant to increase the graph elements according to the font size, so the graph does not look tiny next to a huge font. Anyway, there is no need to delete and recreate the items, just calculate the new coordinates and pass them to Canvas.coords() Is it possible to do it dynamically; I mean the graph is already drawn, now with a Menu, suppose I want to provide the user with options of 50%, 100% and 200% font size. You will need to store the line thicknesses in variables so that the drawing routine can be parameter driven. Then simply delete the existing graph and redraw it with the new thickness - remember you may need to rescale your axis to cater for thicker/thinner lines. This is probably not necessary either, you can query the size of canvas elements dynamically, use Canvas.bbox() to query width and height of rectangles or Canvas.itemcget(item, 'width') and again Canvas.bbox() for line elements. If you are using a filled Rectangle rather than a real line (which is what I would actually expect to see in a bar chart) then obviously the line thickness simply involves setting the difference in the y coordinates appropriately. If you only want to be able to resize the graph elements into half and double size it is probably easiest to use the Canvas.scale() method for this, like from Tkinter import * c=Canvas() c.pack(fill='both', expand=1) r = c.create_rectangle(20, 20, 70, 30, fill='red') c.scale(r, 20, 20, 2, 2) c.scale(r, 20, 20, 0.5, 0.5) However, text, image and window items cannot be scaled. If you want to scale text items, it might be the best to pre-define e.g. three pixel-sized fonts, like fonts = {'small':'helvetica -10', 'normal':'helvetica -12', 'big':'helvetica -14'} and then provide a callback that will both change the font size for the text elements and scale the graph elements (and the x- and y-axis). I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Change the font size of the lines and rectangle on aTkinter Canvas
On Tue, 16 Jan 2007 09:56:27 + (GMT) ALAN GAULD [EMAIL PROTECTED] wrote: --- Asrarahmed Kadri [EMAIL PROTECTED] wrote: Is there a method that redraws the toplevel windows that is holding the widgets Yes, you can issue an update() command to any widget. Usually you don't need to as Tkinter figures out when things have changed and updates itself, but occasionally you may need to fo it manually. Or, if you mean to change the toplevel's size, use Toplevel.configure(width=..., height=...) Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] 'root' dir of a package from within the package ?
On Mon, 8 Jan 2007 19:24:37 + Dave S [EMAIL PROTECTED] wrote: Hi all, I have written a python package, which works fine, the 'root' directory is 'my_app' with sub directories within in, complete with there __init__.py files. I need to work out the path to the root directory from within the app, os.path gives me pythons path! - oh and its in XP. Any suggestions ? Hi Dave, app_root = os.path.abspath(sys.path[0]) or, within the main executable .py file, app_root = os.path.abspath(os.path.dirname(__file__)) should do the trick. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] order of arguments in function
On Tue, 05 Dec 2006 22:18:02 -0800 Dick Moores [EMAIL PROTECTED] wrote: Say I have a function, def my_function(max, min=0): return max - min The order of arguments is counterintuitive, but it seems it can't be changed if I want to have a default min. Is there way to write def my_function(min=0, max): stuff def my_function(min, max=None): if max is None: max = min min = 0 # stuff I am not sure if this is more intuitive though. Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] order of arguments in function
On Wed, 06 Dec 2006 04:29:54 -0800 Dick Moores [EMAIL PROTECTED] wrote: (...) def my_function(min, max=None): if max is None: max = min min = 0 # stuff Great! I am not sure if this is more intuitive though. def my_function(min, max=None): if max is None: max, min = min, 0 return max - min my_function(3, 7) 4 I meant that the order min, max is more intuitive than max, min. Don't you agree? And it's the order used in random.randint(), random.randrange(), and random.uniform(), for examples. Sure I agree, although it may depend on what the function actually does and how you name it (and the arguments). If you e.g. rewrite your example to def subtract(from_, what=0): return from_ - what the changed order of arguments seems quite intuitive to me. What I meant in the first place is that it might be unintuitive that if you pass only one argument this is the one that comes last in case you pass two arguments. As I said, I was not sure and was too lazy to think much about it :-) Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Getting the screen size....using Tkinter
On Mon, 4 Dec 2006 16:43:42 + Asrarahmed Kadri [EMAIL PROTECTED] wrote: Hi folks, Is it possible to get the screen size using a standard API of Tkinter? And also any function to position the window in the center of the screen..?? Thanks in anticipation. You might want to have a look at Pmw's _centreonscreen method: def _centreonscreen(self): # Centre the window on the screen. (Actually halfway across # and one third down.) parent = self.winfo_parent() if type(parent) == types.StringType: parent = self._hull._nametowidget(parent) # Find size of window. self.update_idletasks() width = self.winfo_width() height = self.winfo_height() if width == 1 and height == 1: # If the window has not yet been displayed, its size is # reported as 1x1, so use requested size. width = self.winfo_reqwidth() height = self.winfo_reqheight() # Place in centre of screen: x = (self.winfo_screenwidth() - width) / 2 - parent.winfo_vrootx() y = (self.winfo_screenheight() - height) / 3 - parent.winfo_vrooty() if x 0: x = 0 if y 0: y = 0 return '+%d+%d' % (x, y) If you replace self resp. self._hull with your window and pass the return value to a call of its geometry() method it should do what you want. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] help with Tkinter, please
On Sat, 25 Nov 2006 17:23:39 -0800 Dick Moores [EMAIL PROTECTED] wrote: I've done a lot of fiddling around with setting side=left, and trying to put all the buttons inside a second Frame inside the first one, but I can't get the layout I want, which is the Label on top of the Entry, then a row of the first 3 buttons (which respectively trigger 3 different computations on the integer the user enters). Then below that, the Exit button, with the Text widget at the bottom. How to do this? Is it impossible with the pack() method? It is certainly not impossible, as long as you do not mind creating a bunch of extra Frames, however to me this really sound like a job for grid() . You could simply use grid(row=xx , column=0, columnspan=2) for the widgets that should use the whole window's width and grid the 3 buttons into columns 0, 1 and 2 . Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] help with Tkinter, please
On Thu, 23 Nov 2006 13:08:40 -0800 Dick Moores [EMAIL PROTECTED] wrote: def compute_fact(): value = int(entry_get()) Ooops, sorry for the typo, of course it is entry.get() not entry_get() Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] How to make the label left justified in a frame
-- Forwarded to tutor list -- On Thu, 23 Nov 2006 16:25:41 + Asrarahmed Kadri [EMAIL PROTECTED] wrote: Sorry to bother you, But can u please explain what does grid_columnconfigure() do.. The best place for questions like this are usually the Tk man pages :) Once you get used to them it is easy to figure out how to translate them into Python. From the grid manpage: grid columnconfigure master index ?-option value...? (...) The -weight option (an integer value) sets the relative weight for apportioning any extra spaces among columns. A weight of zero (0) indicates the column will not deviate from its requested size. A column whose weight is two will grow at twice the rate as a column of weight one when extra space is allocated to the layout. (...) So if you have a Frame f and do: f.grid_columnconfigure(0, weight=0) f.grid_columnconfigure(1, weight=2) f.grid_columnconfigure(2, weight=1) column 0 will not expand at all when the frame is stretched horizontally, column 2 will expand and column 1 will expand even more. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] help with Tkinter, please
On Thu, 23 Nov 2006 02:07:17 -0800 Dick Moores [EMAIL PROTECTED] wrote: I think I see how to make a simple GUI with Tkinter, but I still don't see how to use one with even a simple, previously non-GUI Python script. I'm wondering if someone could create an example for me, using the 2 functions fact() and printFact() at http://www.rcblue.com/Python/fact.txt. I'm thinking of something really plain and simple. A frame widget, an entry widget, and a text widget. The user enters an integer n (which can be very large), and the text widget shows n! in 2 formats, as the output of a modified printFact(). Maybe a button is also necessary? Hi Dick, assuming the functions you want to use are in a separate module fact.py, a simple (and dirty) solution might look like from Tkinter import * import fact root = Tk() entry = Entry(root) entry.pack(side='top') text = Text(root) text.pack(side='top') # now you need a callback that calls fact() and inserts the result into the text widget def compute_fact(): value = int(entry_get()) result = fact.fact(value) newtext = 'Result: %d\n' % result# change this to the output format you wish text.insert('end', result) button = Button(root, text=Compute fact, command=compute_fact) button.pack(side='top') root.mainloop() In case you do not want an extra button, you can bind the compute_fact() callback to Key-Return events for the entry: entry.bind('Return', compute_fact) however you will have to change the callback's constructor to accept an event object as argument: def compute_fact(event): (...) or : def compute_fact(event=None): (...) which allows both. In case you want the output formatting done in the fact module, change the printFact() function, so that it *returns* a string instead of printing it to stdout, so you can use a callback like: def compute_fact(event=None): text.insert('end', fact.printFact(int(entry.get( I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] How to make the label left justified in a frame
On Thu, 23 Nov 2006 14:14:59 + Asrarahmed Kadri [EMAIL PROTECTED] wrote: Hi Folks, I am using grid manager inside a frame to arrange 4 label widgets, one beneath the other. What I want is that all teh labels should be placed in the left of the frame... There is no effect of using sticky = W. Please help ; is it possible to do it with anchor..??? I have the follwng code: frame3 = Frame(root,relief='sunken',bd=2) frame3.pack(fill='x') label_st_date = Label(frame3,text='Start Date:',font=font_object2) label_st_date.grid(row=0) label_ed_date = Label(frame3,text='End Date:') label_ed_date.grid(row=1,sticky=W) label_st_time = Label(frame3,text='Start Time:') label_st_time.grid(row=3,sticky=W) label_ed_time = Label(frame3,text='End Time:') label_ed_time.grid(row=4) Hi Asrarahmed, sticky=W does put the labels to the frame's left side; the problem is that the frame's grid column does not expand beyond the requested size of the labels. To fix this, you need to call: frame3.grid_columnconfigure(0, weight=1) (similar to pack(fill=X, expand=True)). I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Sloppy Code ?
On Mon, 13 Nov 2006 17:13:25 +0200 Matt Erasmus [EMAIL PROTECTED] wrote: Hi guys Very new to python programming but am really enjoying it. Anyway, I was just wondering if this code could be improved on in anway. ... stdin, stdout, stderr = os.popen3('/bin/hostname -f') system_name = stdout.read() stdin.close() stderr.close() stdout.close() ... report.write(System Report for: ) report.write(system_name) ... Is there a better way of doing this ? It works for what I want to do, but I would like to know if there's another way of doing things import socket print socket.gethostname() I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Simple calculator
Hi Joe, On Tue, 31 Oct 2006 18:37:27 -0800 Joe Cox [EMAIL PROTECTED] wrote: I found this simple calculator on the web: from Tkinter import * from math import * ###http://sunsite.uakom.sk/sunworldonline/swol-02-1998/swol-02-python.htmlBy Cameron Laird and Kathryn Soraiz...Getting Started with Python### def evaluate(event): label['text'] = Result: + str(eval(expression.get())) frame = Frame(None) entry = Entry(frame) entry['textvariable'] = expression = StringVar() entry.bind(, evaluate) label = Label(frame) button = Button(frame, text = Submit, command = evaluate) frame.pack() entry.pack() label.pack() button.pack() frame.mainloop() I get this: Traceback (most recent call last): File D:\Python24\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py, line 310, in RunScript exec codeObject in __main__.__dict__ File D:\Python24\Calculator\Calc.py, line 12, in ? entry.bind(, evaluate) File D:\Python24\lib\lib-tk\Tkinter.py, line 933, in bind return self._bind(('bind', self._w), sequence, func, add) File D:\Python24\lib\lib-tk\Tkinter.py, line 888, in _bind self.tk.call(what + (sequence, cmd)) TclError: no events specified in binding this code seems to be quite old, so I guess that the line entry.bind(, evaluate) used to be legal in older version of Tk. I don't know what it is supposed to do, though. Maybe there was some default event defined for such cases. In today's Tk you need to specify an event sequence the callback should be bound to, like entry.bind(Any-KeyRelease, evaluate) This does not work either, because you will get a syntax error on incomplete expressions like 3* when trying to type in 3*3 , so the evaluate() callback will have to catch this syntax error: def evaluate(event): try: label['text'] = Result: + str(eval(expression.get())) except SyntaxError: pass This still does not work, when you press the submit button you get: Traceback (most recent call last): File /usr/lib/python2.4/lib-tk/Tkinter.py, line 1345, in __call__ return self.func(*args) TypeError: evaluate() takes exactly 1 argument (0 given) so the constructor must be changed like: def evaluate(event=None): (...) because the Tkinter.Button's command callback is called without any arguments (again I don't know if this was different in old Tk versions). With these changes at least the few simple examples I tried seem to work. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Help me with graphs...using tkinter
Hi Asrarahmed, On Wed, 1 Nov 2006 16:16:31 + Asrarahmed Kadri [EMAIL PROTECTED] wrote: Hi folks, I want to draw bar-charts using Tkinter. I am not able to find material on this topic. have a look at the Canvas widget and especially at its create_rectangle() method. Documentation is here: http://effbot.org/tkinterbook/ I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] PyAlsaAudio with Multiple Sound Cards?
On Fri, 20 Oct 2006 18:13:04 -0400 Rick Sterling [EMAIL PROTECTED] wrote: Hi. I am pretty new to Python, but am trying to get up to speed so I move over to Python from Perl. One progam I wrote in Perl I am trying to re-write in Python. It controls the mixer settings on my sound card. I managed to rewrite most of it by borrowing and stealing from the mixertest.py included with PyAlsaAudio. I haven't been able to figure out on thing however. I know that normally when you assign the mixer with: mixer = alsaaudio.Mixer(Master) It seems to use the first card in the system. My system has two sound cards, and I can't figure out how to access the second card. Digging around online I found the following syntax: mixdev = alsaaudio.Mixer(mixer, id, device) I don't know what values it expects for id and device. I have tried using 0 for the id and using hw:1 for the device to no avail. I am sure it is something simple, but after trying many different things I still haven't been able to figure out how to access my second sound card. Hi Rick, isn't there any documentation for pyalsaaudio? If no, maybe you would be better off using ossaudiodev, which works well with ALSA, too. For the device question, I guess they might want something like device=/dev/snd/hwC0D0 or however these device files are named on your system. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] How to get the width of teh button widget..??
On Fri, 20 Oct 2006 11:55:10 +0100 Asrarahmed Kadri [EMAIL PROTECTED] wrote: Folks, Sorry for asking you such a trivial question.!!! But i want to size up all the buttons with the same size as the largest one in the interface.. And thats why I am asking this question.. Hi Asrarahmed, in case you use Tkinter, something like this should do the trick (untested): b1 = Button(master, text='Hi') b1.grid(row=0, column=0, sticky='ew') b2 = Button(master, text='Good-bye') b2.grid(row=0, column=1, sticky='ew') maxwidth = 0 for button in (b1, b2): w = button.winfo_reqwidth() if w maxwidth: maxwidth = w master.grid_columnconfigure(0, minsize=maxwidth) master.grid_columnconfigure(1, minsize=maxwidth) or, if this is an option for you, use a Pmw.ButtonBox and call its alignbuttons() method. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] an alternative to shutil.move()?
On Mon, 16 Oct 2006 01:16:19 +0200 Alfonso [EMAIL PROTECTED] wrote: Is there an alternative in python to use shutil.move()? It copies the files and then removes the source file insted of just moving directly the file (don't know much about file systems, but I suppose that when you move using the shell, if both source and destination are in the same partition, it's just a matter of changing the entries in the file allocation table). Copying the entire file, specially with big files is very slow, and I think that it makes an unnecesary use of the hard drive and system resources, when both source file and destination are on the same partition... Try os.rename(old, new) I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Help me with this Tkinter code
On Tue, 10 Oct 2006 23:32:57 +0100 Asrarahmed Kadri [EMAIL PROTECTED] wrote: The error message is as under: *Microsoft Visual C++ Runtime Library* * Runtime Error! Program: C:\python\Lib\site-packages\pythonwin\Pythonwin.exe* * This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more inforamtion.* Any idea??? what is this and how can it be fixed??? If you run a Tkinter program from IDLE you should not call mainloop(), as Alan pointed out before, you try to run a new mainloop inside the already existing one which confuses Tk (at least this was true for the version of IDLE i had used). I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] tkinter
On Mon, 9 Oct 2006 14:00:26 +0100 Alan Gauld [EMAIL PROTECTED] wrote: We try to build new software using python and tkinter. We would like to enter some fields using grid style. Based on the fact that you say: these. I hope I could explain I did not mean this grid which is using instead of pack. I assume you mean like a spreadsheet grid of cells? we wonder if there is already some classes or widgets to do this. I'm not aware of such a control but its quite likely someone has built one. Try asking on the Tkinter mailing list, they are more likely to know. As far as I know the tktable widget (http://tktable.sourceforge.net) is a quite advanced spreadsheet widget, and there is a Python wrapper module in the demos directory, I never used it though. Another option is the Tix.Grid, unfortunately there is only a partially implememted (and partially broken) python interface included in the Python-2.5 Tix module. For more functionality you can try the Tix.Grid wrapper I wrote a while ago (http://www.8ung.at/klappnase/TixGrid/TixGrid.html), however it is not much tested and the tixGrid itself seems to be alpha or beta quality, some methods do not seem to have any effect. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Seeking good resources for Tkinter
On Mon, 9 Oct 2006 22:04:17 +0100 Asrarahmed Kadri [EMAIL PROTECTED] wrote: Hi folks, I want to learn the GUI programming in Python. Can you suggest some nice web resources as well as books to start. Thanks in anticipation. Hi Asrar, for Tkinter a good place to start is the wiki: http://tkinter.unpy.net/wiki/ Several Tkinter books are mentioned here: http://tkinter.unpy.net/wiki/books where John Grayson's Python and Tkinter programming is (although it is a little outdated) still the ultimate resource. For a start the Tkinter reference from New Mexico Tech (http://infohost.nmt.edu/tcc/help/lang/python/tkinter.html) and Frederik Lundh's book (http://www.pythonware.com/library/tkinter/introduction/) are good, too (and they are free). I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter GUI Grid Layout Manager
On Wed, 20 Sep 2006 21:21:25 -0700 (PDT) Johnston Jiaa [EMAIL PROTECTED] wrote: I am trying to get 3 buttons, equally separated along the top of the window. How do I get them to all be the same size and how do I make them so that they are equidistant to each other? Along with those three buttons, I am trying to get a text box, near the middle of the window. Every time I attempt to put this in, it messes up the position of the top buttons. My code follows: # Top Mode Widgets # Settings Button self.settings_bttn = Button(self, text = Settings) self.settings_bttn.grid(row = 0, column = 2, columnspan = 2, sticky = EW) # Statistics Button self.stats_bttn = Button(self, text = Statistics) self.stats_bttn.grid(row = 0, column = 5, columnspan = 2, sticky = EW) # Procrastinate Button self.proc_bttn = Button(self, text = Procrastinate) self.proc_bttn.grid(row = 0, column = 8, columnspan = 2, sticky = EW) # Top-Mid Separator self.top_mid_sep_lbl = Label(self, text = --) self.top_mid_sep_lbl.grid(row = 1, column = 0, columnspan = 10, sticky = EW) # Mid Assignments Widgets # Assignments Text Display self.assign_disp_txt = Text(self, width = 30, height = 18, wrap = WORD) self.assign_disp_txt.grid(row =3, column = 1, columnspan = 5, sticky = W) Hi Johnston, in order for the columns to actually expand you will have to use grid_columnconfigure(column, weight=1), in order to make sure all buttons have the same size you can calculate the maximum size of all buttons and pass it to grid_columnconfigure() as minsize before actually gridding them, like max = 0 for b in (self.settings_bttn, self.stats_bttn, self.proc_bttn): w = b.winfo_reqwidth() if w max: max = w self.grid_columnconfigure(0, weight=1, minsize=max) # etc. self.settings_bttn.grid(row = 0, column = 2, columnspan = 2, sticky = EW) I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] about tkinter
On Tue, 5 Sep 2006 01:46:02 -0700 linda.s [EMAIL PROTECTED] wrote: If I close the 'main' window, 'sub' window will be closed too. How can I close just one window? Linda Hi Linda, you can use a hidden root window, like this: root = Tk() root.withdraw()# hide the root window top1 = Toplevel(root) top2 = Toplevel(root) Don't forget to define a method that exits the application when the last Toplevel is being closed, because if you close both Toplevels the root window is still there and no way to close it from the gui. Here is a primitive to show how this might work: def close_top1(): global top1 top1.destroy() top1 = None if top2 is None: root.quit() top1.protocol(WM_DELETE_WINDOW, close_top1) ( and the same for top2 of course) This makes the close_top1() function be executed when the X in the window's upper right corner is clicked. I hope this helps. Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter Icon Suse 10
On Fri, 25 Aug 2006 15:14:49 -0400 Alberto Troiano [EMAIL PROTECTED] wrote: Hi everyone It's been a long time since I left Python for .NET 2003, but then again I need it to make an app under Linux Suse 10 and I have a question I'm trying to put an icon to my window... Here is the code so far: ###Start Code### import Tkinter from Tkinter import * root = Tk() root.iconbitmap(Change.ico) root.mainloop() ###End Code### It works great under Windows but on an Suse 10 Machine it complains about the file. Is this because the icon files are not the same as in Windows or should I be using another sentence to make it work? I know it's a dumb question but I'm out of practice and I couldn't find docs on Google (maybe I didn't look where I supposed to) Ups..I forgot, I'm using Python 2.4.1 Hi Alberto, you will have to use an xbm bitmap file for the iconbitmap, like root.iconbitmap(@Change.xbm) HTH Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Limiting Characters
On Mon, 21 Aug 2006 13:19:54 -0400 Marcus Dean Adams [EMAIL PROTECTED] wrote: I_m fairly new to python, I_ve been dabbling in it for school and I have a question. I_ve written a few programs using graphical windows with input boxes such as a stopwatch, temperature converter, etc. I_ve always found a gui much prettier than command line. Anyway, I have limited the size of the input boxes to the number of digits I wanted, but you can still put more digits than that in the box. For example, the temperature converter input box is only 3 digits wide, however I can enter a 20 digit number if I want, it just only shows 3 digits at a time. How can I actually limit the number of characters a user can enter, and not just the size of the input box? Hi Marcus, this depends of course on the toolkit you use. If it is Tkinter, you can use the Entry widget's validatecommand, see: http://mail.python.org/pipermail/tkinter-discuss/2006-August/000863.html I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] i18n Encoding/Decoding issues
Hi Jorge, On Thu, 10 Aug 2006 13:32:10 +0100 Jorge De Castro [EMAIL PROTECTED] wrote: (...) Using unicode(body, 'latin-1').encode('utf-8') doesn't work either. Besides, am I the only one to feel that if I want to encode something in UTF-8 it doesn't feel intuitive to have to convert to latin-1 first and then encode? if the above does not work, it is because the original message is not latin-1 encoded. unicode(body, 'latin-1') does not convert *to* latin-1, but convert a latin-1 encoded string into unicode. This will obviously only work as expected if the original string is actually latin-1. In order to safely convert the message body into utf-8 you would have to find out which encoding is used for the message and then do unicode(body, original_encoding).encode('utf-8') Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Listbox selection
Hi Joe, On Thu, 3 Aug 2006 11:12:28 -0700 Joe Cox [EMAIL PROTECTED] wrote: I am still having a problem getting my listbox's binded to the radiobuttons. I am getting closer. ###Assign each Radiobutton with its own listbox values, show one selected button and one listbox### from Tkinter import * root = Tk() var = StringVar() var.set('a') { 'Aluminum' : ['Wrought', 'Die cast'], 'Steel' : ['Low Carbon', 'Medium-high carbon','Alloy'] } Didn't you want to keep a reference to the dictionary? def radio_command(): if var.get() == 'a': # button with value 'a' selected listbox.insert('a') #here I am trying to put the string starting with 'Steel' in the listbox elif var.get() == 'b': # button with value 'b' selected listbox.insert('b') #here I am trying to put the string starting with 'Aluminum' in the listbox radio_a = Radiobutton(root,text=Steel, variable=var, value='a', command=radio_command).pack() Are you aware that pack() returns None, so you actually assign None to all your radio_* variables; if you want to keep access to the widgets you need to do: radio_a = Radiobutton() radio_a.pack() radio_b = Radiobutton(root,text=Aluminum, variable=var, value='b', command=radio_command).pack() radio_c = Radiobutton(root,text=Cast Iron, variable=var, value='c', command=radio_command).pack() radio_d = Radiobutton(root,text=Nickel, variable=var, value='d', command=radio_command).pack() radio_e = Radiobutton(root,text=Titaniuim, variable=var, value='e', command=radio_command).pack() listbox = Listbox(root) for item in (): listbox.insert(END, item) The last two lines don't really seem to have much sense, if you want an empty Listbox, just don't insert anything. listbox.pack(side=LEFT, fill=BOTH) root.mainloop() I am not sure what your question is here, maybe you want to try something like (untested): var = StringVar() var.set('Steel') listbox = Listbox(root) listbox.pack(side=LEFT, fill=BOTH) metals = {'Aluminum' : ['Wrought', 'Die cast'], 'Steel' : ['Low Carbon', 'Medium-high carbon','Alloy'] } def radio_command(): listbox.delete(0, 'end') for m in metals[var.get()]: listbox.insert('end', m) for metal in metals.keys(): # assuming that you don't need to keep references to all buttons Radiobutton(root, text=metal, variable=var, value=metal, command=radio_command).pack() # fill the listbox with initial values radio_command() I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Multiple buttons, One callback (fwd)
-- Forwarded message -- Date: Fri, 4 Aug 2006 09:32:48 -0700 (PDT) From: Michael Cochez [EMAIL PROTECTED] To: [EMAIL PROTECTED] Subject: Multiple buttons, One callback Hi Danny, I've just been reading your reply on this subject at http://mail.python.org/pipermail/tutor/2005-September/041358.html about a year ago. I need something like this but also something more: I'm making an app with an interface that is going to look like in the added image. The = buttons are there to copy the contents of the previous lines to the current line. To make the buttons tried a lot of things but the problem is: the number of buttons is always different (one less as the number of day) so it can be none or 20 or something else. So i putted the creation in a for loop. But now the real problem: every button must have its own callback(because the linenumber is different) So my question is: how can I give each button its 'own' callback while only having one (the callbacks are all the same but with another value of linenumber. I added a piece of the code to show what i mean. I would use a lambda for this, like: def makeidentical(linenumber): print the linenumber is: %d % (linenumber) for day in datelist: a=datelist.index(day) if a0:#on every line exept the first identicalbutton=Button(frame2,text==,command=lambda : makeidentical(a)) identicalbutton.grid(row=a+2,column=3,sticky=W) frame2widgets.append(identicalbutton) I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] : finding out if the horizontal scrollbar on a Tix.CheckList is being used or not
On Fri, 21 Jul 2006 15:01:30 -0400 Orri Ganel [EMAIL PROTECTED] wrote: As a follow up to my last email, I think the issue is more that the display doesn't update before the command associated with the search button has finished processing, so any attempts to get data about the display from within the method are fruitless since the display hasn't changed yet. I am well and truly stumped. I have no idea how to get around this. Calling update_idletasks() from within this method before quering diplay data should do the trick. The only way I can think of to do this without using the display is figuring out the longest track name length and setting the CheckList width to the pixel version of that. Unfortunately, I don't know the conversion for character units to pixels, either, so I'm still stuck. I think the tkFont module has what you need: from Tkinter import * l=Label(text='hi') l.pack() import tkFont f=tkFont.Font(family='helvetica', size='-14') l.config(font=f) print f.measure(l['text']) 11 print f.measure('blahblah') 54 I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Help me make it look pretty!
On Thu, 20 Jul 2006 20:16:58 +0100 John CORRY [EMAIL PROTECTED] wrote: Good evening all. I am writing a program using python 2.4, glade 2 and pygtk. It takes input from the user using textentry boxes. The input should be a number. When the user keys the data in, it automatically left justifies. The function below, takes the input for four boxes and right justifies it by using an ugly, string format. The boxes are 45 characters big, so I use the len function to fit them into the box. The code is below. I am looking for a way to set the text entry up, so that there is a decimal point in the box regardless of what the user does and I am also looking for a way to keep the numbers right justified. Any suggestions or comments as always are greatly appreciated. Hi John, I don't know about gtk, but have made some experience validating the user input in Tkinter Entries, so I can only try to give you some general advice. First, the Tkinter.Entry has a configuration option justify, so entry.config(justify=RIGHT) would very simply solve the first problem; are you sure the gtk entry box does not have something similar? Second, I found validating (and especially on-the-fly-converting) user input is always a very tricky thing. Usually when testing some solution that seemed to work, I found that in some special cases the widget showed an completely unexpected behavior. Generally it is safer not to restrict user input too much and do the validation when the entry boxes' contents are actually needed; if it is not valid you can pop up a message box that tells the user what to do. If you really need to perform real time validation, make sure to test your widgets very carefully. Again, I don't know about gtk, in Tkinter you can pass a validatecommand to the entry widget to which you can pass the old and the new entry's contents, that is called each time the user types something into the entry box. If gtk offers something similar, you could start with something like: # pseudo code def validate(old, new): x = text38.get_text() if x in ('', '.'): ok = 1 elif '.' in x: try: float(x) ok = 1 except ValueError: print '\a'#acoustic feedback, in Tkinter I would use bell() of course ok = 0 else: try: int(x) text38.set_text('.'+x)#don't know how this would actually look in gtk, I hope you know what I mean ok = 1 except ValueError: print '\a' ok = 0 if not ok: # the new text is not allowed, restore the old text38.set_text(old) I bet this kind of solution has its traps, too. Maybe the best solution is a web search if someone else has already written such a widget. A quick google search for pygtk entry validation for example lead me here: http://www.astro.umass.edu/~dpopowich/python/ : ValidatedEntry, a pygtk extension providing a validated Entry widget ValidatedEntry is a subclass of gtk.Entry, providing validation of input based on programmable functions. Sample functions included in the package provide validation for integers, floats, non-empty strings, ISBN numbers, phone numbers, money and bounded values (e.g., integers in a range). A demo app is included in the package. The latest version, 1.0.4, can be downloaded here. Good luck! Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] : finding out if the horizontal scrollbar on a Tix.CheckList is being used or not
On Fri, 21 Jul 2006 03:02:30 -0400 Orri Ganel [EMAIL PROTECTED] wrote: Hello all, I'm working on the GUI for my extended iTunes search, which allows searches far beyond the native iTunes capability. Once the search has been completed, a window contining a Tix.CheckList with the resulting tracks is displayed. If anyone has any idea how to figure out whether or not the horizontal scrollbar is visible (ie if the length of the track name extends beyond the width of the CheckList) programmatically, I'd be extremely grateful :-). Hi Orri, how about check_list.hsb.get() ? I think in case it is != (0.0, 1.0) the scrollbar should be visible. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] [tutor] how to get the fileextention?
On Thu, 20 Jul 2006 11:19:46 +0300 [EMAIL PROTECTED] wrote: Hi, is this the right (shortest) way to get the file extention (under MS WIN)? def getext(fname): ext = fname.split('.').pop() return ext Hi Emily, for filename operations, you should have a look at the os.path module. In your case os.path.splitext(fname)[1] should do the trick, or if you need to remove the leading period from the extension (as in your example) os.path.splitext(fname)[1][1:] . I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] abs beginner first project
On Wed, 12 Jul 2006 06:48:44 -0500 Luke Paireepinart [EMAIL PROTECTED] wrote: For example, in Tkinter, you can bind buttons to function calls, but you can't have buttons pass arguments to the functions. So you have to somehow make a separate function for each button, or do some weird backend event handling stuff that you can look up if you're really interested. BTW, that is not really true: from Tkinter import * def test(*args): ... print args ... root = Tk() b = Button(root, text='Hi', command=lambda widget=b: test(widget)) b.pack() Now when you press the button, you get: (Tkinter.Button instance at 0xb78a478c,) so the callback actually knows which widget called it, and you could easily perform different actions for several buttons. I know that is not what this thread is about, I just could not resist... Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] combo box
On Tue, 06 Jun 2006 13:39:21 +0700 kakada [EMAIL PROTECTED] wrote: Dear Friends, I am now working on GUI python (Tkinter). I want to use combobox as my widget, but I cannot find it in any document. Does anybody have experience with that? There is no ComboBox widget in plain Tkinter. Probably the easiest way to get one is to use Tix which is included in the windows python distribution and should be available in any recent linux distro. If you want to use Tix simply replace the import line from Tkinter import * with from Tix import * You then can use your Tknter widgets as usual, plus a nice set of extra widgets (ComboBox, NoteBook, DirTree etc.) . I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] laying out frames
On Mon, 15 May 2006 15:42:48 -0400 (EDT) Zubin Wadia [EMAIL PROTECTED] wrote: Hello Everyone, Another basic question in regard to frame layouts with Tkinter. I want to create a basic quadrant of frames but am not able to follow the logic to do so, whats the right way or an easier way to control layout of frames and wigets. A pixel approach would be nice (where by you can specify pixel locations for a frame or a widget to be located) instead of specifying arbitary location positions like LEFT, RIGHT, etc and things moving constantly when you add more widgets or resize windows. Hi Zubin, there are three different geometry managers in Tkinter, pack(), grid() and place(). As you have noticed, pack() is very handy to use for simple gui layouts but more complex ones may be hard to achieve. grid() is more flexible than pack(), it lets you arrange widgets in row and columns, e.g.: from Tkinter import * root = Tk() # define rows and columns that should expand on window resizing root.grid_rowconfigure(1, weight=1) root.grid_rowconfigure(2, weight=1) root.grid_columnconfigure(0, weight=1) Label(root, text='Label1', bg='white').grid(row=0, column=0, sticky='ew') Label(root, text='Label2', bg='yellow').grid(row=0, column=1) Label(root, text='Label3', bg='green').grid(row=0, column=2) Label(root, text='Label4', bg='red').grid(row=1, column=0, columnspan=2, sticky='nsew') Label(root, text='Label5', bg='blue').grid(row=2, column=0, columnspan=3, sticky='nsew') root.mainloop() place() is even much more flexible than grid(), but it is much more complex to use, too, so I recommend to think twice if you really need its capabilities. With place() you can define absolute or relative x ynd y coords of a widget in its container and relative or absolute dimensions, e.g: from Tkinter import * root = Tk() Label(root, text='Label1', bg='green').place(x=10, y=40, relwidth=0.5, relheight=0.3) Label(root, text='Label2', bg='yellow').place(relx=0.1, rely=0.8, width=60, height=30) root.mainloop() I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] help with erros using subprocess module
On Thu, 11 May 2006 10:59:19 -0700 (PDT) Jerome Jabson [EMAIL PROTECTED] wrote: Am I missing some module you are referencing with types? Hi Jerome, that's right, try import types first. Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] laying out a menu widget inside a frame
On Thu, 11 May 2006 15:03:53 -0400 (EDT) Zubin Wadia [EMAIL PROTECTED] wrote: Hello All, from Tkinter import * class App: #create a frame def __init__(self, master): frame = Frame(master, bg=LIGHTBLUE, relief=RIDGE, bd=3) frame.pack(side=TOP, ipadx=15, ipady=15, fill=X) ##create dropdown menu menubar = Menu(frame) filemenu = Menu(menubar) menubar.add_cascade(label=File, menu=filemenu) filemenu.add_command(label=New) root.config(menu=menubar) ##edit root = Tk() root.minsize(100,100) app = App(root) root.mainloop() This works great but I can't get the dropdown menu to layout in the frame widget instead of the root. I tried frame.config() in the ##edit line but I don't think there is a config method for the frame widget, it errors out. Hi Zubin, there is a typo in your code, it should be master.config(menu=menubar) but this does not seem to be your problem? If you just want the menu to be inside the lightblue, RIDGE part of the window, try: root.config(relief=RIDGE, bg=lightblue, bd=3) and relief=flat, bg=lightblue on the frame. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] ossaudiodev, pygtk, and flushing buffers
On Wed, 10 May 2006 09:59:14 -0700 Matthew White [EMAIL PROTECTED] wrote: Hello All, I'm writing a little audio player that plays voicemail files. (I realize I'm reinventing the wheel, but it's still fun.) The problem I'm experiencing is that I'm hearing the last fraction of the sound clip twice, either when the clip is done playing or when the program exits. I've tried a few things and none of them have worked. The bit of code that does the playing is here: def play(self): if self.data_written self.file_length: buf = self.data.read(self.buf_size) self.data_written += self.dsp.write(buf) self.percent_done = self.data_written / self.file_length if self.data_written == self.file_length: self._reopen_audio_device() This causes the second playing of the last little bit when the end of the file is reached. When I don't include the second if statement, the last little bit gets played when the program exits. According to the documentaiton, closing the audio device will flush any data in the sound card buffer. I guess what I'm hearing is that buffered clip being flushed. I've thought about using the mixer device to put the volume to zero, flush the buffer, then turning the volume back up again, but that seems like a hack. Hi Matthew, you never explicitely close the audio device, except when calling self._reopen_audio_device(). According to the OSS programmer's guide (http://www.opensound.com/pguide/index.html ) this is generally considered bad practice, because no other application will be able to access the audio device. Probably it is not guaranteed that the device's buffers will be flushed until calling close(), too (maybe calling reset() also flushes the buffers, but after reset() you should close and reopen the device anyway). I have not tried it, but I think the effect you describe may depend on the driver in use. Does it help if you change your play() method like this: def play(self): if self.data_written self.file_length: buf = self.data.read(self.buf_size) self.data_written += self.dsp.write(buf) self.percent_done = self.data_written / self.file_length if self.data_written == self.file_length: self.dsp.close() # then reopen the device right before starting playback, probably from player.PlayerWindow.play() ? There may be a short delay between the call to self.dsp.close() and the actual stopping of playback, (which can be avoided by calling self.dsp.reset() before self.dsp.close()), however this should not be a problem if you play the file to the end, I think. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Simple way for i18n ?
On Thu, 23 Mar 2006 23:58:58 +0100 francois schnell [EMAIL PROTECTED] wrote: Now I'd like to be able to change language without loging out, change language, log in. Martelli says in his book that to set the default language for the app I just need to do: os.environ.setdefault('LANG', 'fr_FR') and Python doesn't complain (but doesn't work) but if I then do: print locale.getdefaultlocale() Python says : ('en_GB', 'utf-8') # meaning that really couldn't work ? How can I have my app in French even if I'm still in the GB version of Ubuntu (change the language for the app) ? Hi Francois, I tried to do so with one of my apps (on Mandrake) and found that I have to change the LANGUAGE environment variable, changing LANG had no effect on this. From the python gettext docs I found: If languages is not given, then the following environment variables are searched: LANGUAGE, LC_ALL, LC_MESSAGES, and LANG. So it looks like the easiest may be to do $ LANGUAGE=en_GB in the shell before you start your app. I've also tried the translation way instead of the install way: if I do: gettext.install(myapp, localedir) #it translates in French when I'm in the French Ubuntu but if I do instead: gettext.translation(myapp, localedir, languages=fr_FR) #with the same localedir which worked before = Python complains: gettext.translation(myapp, localedir, languages=fr_FR) File /usr/lib/python2.4/gettext.py, line 480, in translation raise IOError(ENOENT, 'No translation file found for domain', domain) IOError: [Errno 2] No translation file found for domain: 'myapp' I find it strange that install finds it but not translation (for the same localedir) ? I admit I nevered bothered to find out how to use gettext.translation() since gettext.install() works that fine for me. Maybe you should set languages to fr instead of fr_FR (just a guess though)? I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Simple way for i18n ?
On Wed, 22 Mar 2006 17:41:14 +0100 francois schnell [EMAIL PROTECTED] wrote: Hello all, I wish to translate a Python script from English to French. I've read the offical documentation (python.org doc) but I must admit that I'm lost now ... I've found some simple explanations here but I can't make it work: http://karrigell.sourceforge.net/en/internationalization.htm Here's where I'm stuck: Let's imagine my app is: myapp.py -- import gettext _ = gettext.gettext print _(hello friends) print _(Bye Bye) --- Here are my folders on a windows box: C:\myappfolder\ ---\Translations\francais\LC_MESSAGES My myapp.py is in myappfolder In this folder I've used pygettext.py to produce a messages.pot file = I add the translation in it = I have a messages.po file. I then used msgfmt.py to produce messages.mo file. I then copied messages.po and messages.mo in LC_MESSAGES folder C:\myappfolder\ ---\Translations\francais\LC_MESSAGES I now come back to myapp.py and add two lines: --- import gettext _ = gettext.gettext t=gettext.translation(messages,c:\myappfolder\Translations,francais) t.install() print _(hello friends) print _(Bye Bye) --- When I do that Python anwers: Traceback (most recent call last): File C:\myappfolder\myapp.py, line 4, in ? t=gettext.translation (messages,c:\myappfolder\Translations,francais) File C:\Python24\lib\gettext.py, line 456, in translation raise IOError(ENOENT, 'No translation file found for domain', domain) IOError: [Errno 2] No translation file found for domain: 'messages' Hi Francois, not sure if it is different on windows, on linux I simply do: import gettext gettext.install(domain, localedir) to install _() into my application's global namespace, where localedir in your case was c:\myappfolder\Translations. The path that contains the french translation should be ..\fr\LC_MESSAGES instead of ..\francais\LC_MESSAGES I think (at least that is true on linux). I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Test If File System is mounted in Linux
On Fri, 17 Mar 2006 00:36:35 -0700 fortezza-pyt [EMAIL PROTECTED] wrote: If there a semi-standard way to test if a file system has been mounted or not using Python? In the Linux command line, I can type mount and see all mounted file system, and then see if the one I am looking for is in the list. While I could replicate this with Python, I am curious if there is an easier way. Hi Fortezza, try os.path.ismount() . HTH Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Python and unicode
On Fri, 10 Mar 2006 08:55:35 +0100 Ferry Dave Jäckel [EMAIL PROTECTED] wrote: Hello list, I try hard to understand python and unicode support, but don't get it really. What I thought about this until yesterday :) If I write my script in unicode encoding and put the magic # -*- coding: utf-8 -*- at its start, I can just use unicode everywhere without problems. Reading strings in different encodings, I have to decode them, specifying there source encoding, and writing them in different encode i have to encode them, giving the target encoding. But I have problems with printing my strings with print sys.stderr, mystring. I get ASCII codec encoding errors. I'm on linux with python2.4 My programming problem where I'm stumbling about this: I have an xml-file from OO.org writer (encoded in utf-8), and I parse this with sax, getting some values from it. This data should go into a mysql db (as utf-8, too). I think this works quite well, but debug printing gives this errors. What is the right way to handle unicode and maybe different encodings in python? What encoding should be put into the header of the file, and when to use the strings encode and decode methods? Are there modules (as maybe sax) which require special treatment because of lack of full unicode support? In general I'd like to keep all strings as unicode in utf-8, and just convert strings from/to other encodings upon input/output. Hi Dave, you should be aware that utf-8 is *not* unicode, but just another encoding. Look here for more details: http://www.joelonsoftware.com/articles/Unicode.html I am not sure what happens in your program, but generally when converting a unicode string into a byte string python assumes to use the ascii codec if no other codec is explicitely specified, which seems to be what occurs. In this case calling encode('utf-8') on the unicode string before processing it may help. If you are using strings in different encodings it is probably the best to convert them all into unicode objects after reading with decode() (however you need to know which codec to use) and to use only unicode internally. However you are right, some modules may not be unicode-proof (i don't know about sax though). You will have to encode these strings again when calling these module's functions. If your program is supposed to run on different systems it may help to know the encoding the system uses if you want to read some files there; you can look at the top of the IOBinding module in idlelib to see how to guess the system encoding. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Changing instance attributes in different threads
On Wed, 08 Feb 2006 18:14:14 -0500 Kent Johnson [EMAIL PROTECTED] wrote: Sorry, I missed to insert the time.sleep(0.1) I used in my original while loop into the example above. The reason for using time.sleep() is that I need to avoid lots of loops over an empty buffer. The amount of time until the producer thread reads a new data fragment into the buffer may be significant, depending on the fragment size requested by the driver (e.g my fm801 card wants fragments of 16384 bytes which is about 0.09 audio seconds). On the other hand the buffer may contain hundreds of kB of data if other processes cause a lot of disk I/O. Using Queue.get() will do this for you automatically. If there is no data it will block until something is added to the queue and you avoid a polling loop. If there is data it will return it quickly. Not if I call it with block=0; if I understand the docs correctly the queue will raise a Queue.Empty exception if the queue is currently locked by another thread. No, the block flag controls whether the call will wait until something is in the queue or return immediately. The call to Queue.get() will always block waiting for the lock that controls access to the Queue; it can't even tell if the Queue is empty until it gets this lock. Ah , then I misunderstood what the docs meant with return an item if one is immediately available, else raise the Empty exception. I thought immediately available means the Queue is currently not locked by another thread. Thanks again Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Changing instance attributes in different threads
On Tue, 7 Feb 2006 23:31:06 +0100 Michael Lange [EMAIL PROTECTED] wrote: So I think I need two Condition objects here; it is most important here that thread 1 does not block to minimize the risk of recording buffer overruns, but from reading the docs I am not sure about the correct procedure. So if I change self.rec_locked and self.vu_locked from the code above to be Condition objects is it correct to do: snip Ok, some testing gave me the answer, with the code I posted I got an AssertionError, so obviously the release() call has to be inside the if self.rec_lock.acquire(blocking=0): block. So now my functions look like: gui thread (periodically called by Tkinter): def get_peaks(self): if not self.vu_lock.acquire(blocking=0): return None data = [x for x in self.vubuffer] self.vubuffer = [] self.vu_lock.release() if not data: return None left, right = 0, 0 for d in data: left = max(audioop.max(audioop.tomono(d, 2, 1, 0), 2), left) right = max(audioop.max(audioop.tomono(d, 2, 0, 1), 2), right) return left, right child thread 1: vubuffer = [] recbuffer = [] while self.running: data = self._audioobj.read(self._fragsize)# read data from soundcard vubuffer.append(data) if self.vu_lock.acquire(blocking=0): self.vubuffer += vubuffer vubuffer = [] self.vu_lock.release() if self.recording: recbuffer.append(data) if self.rec_lock.acquire(blocking=0): self.recbuffer += recbuffer recbuffer = [] self.rec_lock.release() child thread 2: while self.recording: # wait a moment until there is something in the buffer to be written data = [] time.sleep(0.1) if self.rec_lock.acquire(blocking=0): data = [x for x in self.recbuffer] self.recbuffer = [] self.rec_lock.release() for d in data: self._waveobj.writeframesraw(d)# write data to file This *seems* to work, however it looks like this code does not separate properly the gui from the child threads which everyone says should be avoided in any case. On the other hand, with the technique I used before, with a boolean as lock, like: if not self.vu_locked: self.vu_locked = 1 self.vubuffer += vubuffer vubuffer = [] self.vu_locked = 0 it seems like the worst case is that both the gui and the child thread pass the test if not self.vu_locked at the same time which might cause some data to be lost from the vubuffer list; probably that is something I could live with. So now my question: Does anyone know how a threading.Condition() object is handled internally, so maybe its methods actually can be called safely from the gui thread? Thanks Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Changing instance attributes in different threads
On Wed, 08 Feb 2006 08:37:18 -0500 Kent Johnson [EMAIL PROTECTED] wrote: Another architecture you might consider is to have thread 1 put the actual acquired buffers into two Queues that are read by the two consumer threads. This would save you a lot of copying and give you a cleaner implementation. It may block on the producer thread but the Queue is locked only while something is actually being put in or taken out so the blocks should be short. For example (not tested!): def get_peaks(self): try: data = self.vu_queue.get_nowait() except Queue.Empty: return None left, right = 0, 0 for d in data: left = max(audioop.max(audioop.tomono(d, 2, 1, 0), 2), left) right = max(audioop.max(audioop.tomono(d, 2, 0, 1), 2), right) return left, right child thread 1: while self.running: data = self._audioobj.read(self._fragsize)# read data from soundcard self.vu_queue.put(data) self.rec_queue.put(data) child thread 2: while self.recording: data = self.rec_queue.get() for d in data: self._waveobj.writeframesraw(d)# write data to file Thanks Kent, the problem with Queues is that Queue.get() returns only one item at a time, but I found that depending on cpu load and disk usage hundreds of data fragments may accumulate into the recording buffer, so in the writer thread I would have to use something like (and similar in the get_peaks() method): while self.recording: data = [] while not self.rec_queue.empty(): try: data.append(self.rec_queue.get(block=0)) except Queue.Empty: break for d in data: self._waveobj.writeframesraw(d) I am not sure if this approach is more robust than the one that uses Condition() objects, however I don't think the code looks cleaner. This *seems* to work, however it looks like this code does not separate properly the gui from the child threads which everyone says should be avoided in any case. I don't understand your concern here. Maybe it is just because I have not fully understood how the Condition objects work; what I had in mind are warnings like this one (from http://www.astro.washington.edu/owen/TkinterSummary.html): All Tkinter access must be from the main thread (or, more precisely, the thread that called mainloop). Violating this is likely to cause nasty and mysterious symptoms such as freezes or core dumps. Yes this makes combining multi-threading and Tkinter very difficult. The only fully safe technique I have found is polling (e.g. use after from the main loop to poll a threading Queue that your thread writes). I have seen it suggested that a thread can safely use event_create to communicate with the main thread, but have found this is not safe. I guess I have to spend a second thought at this. Thanks again Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Changing instance attributes in different threads
On Wed, 08 Feb 2006 13:47:39 -0500 Kent Johnson [EMAIL PROTECTED] wrote: while self.recording: data = [] while not self.rec_queue.empty(): try: data.append(self.rec_queue.get(block=0)) except Queue.Empty: break for d in data: self._waveobj.writeframesraw(d) I don't understand why this is better than my code. It's a little different - you get all the data, then write all the data; I get a little, write a little - but since you are writing one datum at a time in both cases, I don't know why it would make much difference. Sorry, I missed to insert the time.sleep(0.1) I used in my original while loop into the example above. The reason for using time.sleep() is that I need to avoid lots of loops over an empty buffer. The amount of time until the producer thread reads a new data fragment into the buffer may be significant, depending on the fragment size requested by the driver (e.g my fm801 card wants fragments of 16384 bytes which is about 0.09 audio seconds). On the other hand the buffer may contain hundreds of kB of data if other processes cause a lot of disk I/O. You should be able to take the try/except out of your version, since this code is the only consumer from the Queue, if queue.empty() is false, queue.get() should succeed. Not if I call it with block=0; if I understand the docs correctly the queue will raise a Queue.Empty exception if the queue is currently locked by another thread. In the vu meter thread I can see you might want to consume a minimum length of data but again that doesn't seem so hard. OTOH your latest code looks OK too, this was just a suggestion. It was a good suggestion, I never looked at the Queue class before, and it's definitely good to know about it. In my special case here, your other suggestion of using Condition() seems to allow me easier handling of my buffers, though. Another part of my code I did not post here that is executed when the recording is stopped (i.e. self.recording is set to 0) also seems to be easier to implement with the Condition technique. All Tkinter access must be from the main thread (or, more precisely, the thread that called mainloop). OK, yes. What this means is that any code that changes the state of the GUI should be called from the main thread. In your case, that means that the thread that updates the vu meter must be the main thread. If you are calling get_peaks() from a scheduled Tkinter task (scheduled with after() or after_idle()) you will be fine. Yes, that's what I am doing. I think I just was confused because I did not understand what the Condition class does. Now I think I see clearer, thanks for all your help. Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Changing instance attributes in different threads
On Mon, 06 Feb 2006 18:34:18 -0500 Kent Johnson [EMAIL PROTECTED] wrote: It sounds like you have some attributes that you are using as flags to allow one thread to control another. There are definitely some pitfalls here. You probably want to use threading.Condition or Queue.Queue to communicate between the threads. Can you give more details of what you are trying to do? I have used a boolean to control access to a variable that is used by two threads, as in this example: thread 1 does: while self.locked: pass self.locked = 1 if condition: self.name = 'bob' else: self.name = 'mike' self.locked = 0 thread 2 does: while self.locked: pass self.locked = 1 n = self.name self.locked = 0 if n == 'bob': do something else: do something else I *thought* this would be safe, but now reading this thread I start to doubt. Are there any pitfalls I overlooked in this technique? Thanks Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Changing instance attributes in different threads
On Tue, 07 Feb 2006 06:02:45 -0500 Kent Johnson [EMAIL PROTECTED] wrote: One way to make this code thread-safe is to use a threading.Condition() instead of a boolean variable: thread 1 does: self.lock.acquire() if condition: self.name = 'bob' else: self.name = 'mike' self.lock.release() thread 2 does: self.lock.acquire() n = self.name self.lock.release() if n == 'bob': do something else: do something else If this is the only communication or synchronization between the two threads I don't think the lock is needed at all - thread 2 is presumably in a loop and thread 1 is controlling the behaviour of the loop asynchronously. If there is some other kind of synchronization between the loops, and thread 2 is only supposed to run once for each setting of self.name in thread 1, you could use Condition.wait() and Condition.notify() to do the synchronization. Thanks Kent, In fact I have three threads, a main gui thread and two child threads. Child thread 1 reads data from the soundcard and appends these data to two lists which I use as recording buffer. The data from list 1 are used by the gui thread to draw a vumeter, the data from list 2 are written to the target file. So the communication between the threads occurs when the gui thread resp. child thread 2 read and empty the buffer lists to process the data. So my functions currently (with boolean locks) look like: gui thread (this function is called periodically by Tkinter): def get_peaks(self): if self.vu_locked: return None self.vu_locked = 1 data = [x for x in self.vubuffer] self.vubuffer = [] self.vu_locked = 0 if not data: return None left, right = 0, 0 for d in data: left = max(audioop.max(audioop.tomono(d, 2, 1, 0), 2), left) right = max(audioop.max(audioop.tomono(d, 2, 0, 1), 2), right) return left, right thread 1: vubuffer = [] recbuffer = [] while self.running: data = self._audioobj.read(self._fragsize)# read data from soundcard vubuffer.append(data) if not self.vu_locked: self.vu_locked = 1 self.vubuffer += vubuffer vubuffer = [] self.vu_locked = 0 if self.recording: recbuffer.append(data) if not self.rec_locked: self.rec_locked = 1 self.recbuffer += recbuffer recbuffer = [] self.rec_locked = 0 thread 2: while self.recording: # wait a moment until there is something in the buffer to be written time.sleep(0.1) if not self.rec_locked: self.rec_locked = 1 data = [x for x in self.recbuffer] self.recbuffer = [] self.rec_locked = 0 for d in data: self._waveobj.writeframesraw(d)# write the data to a file So I think I need two Condition objects here; it is most important here that thread 1 does not block to minimize the risk of recording buffer overruns, but from reading the docs I am not sure about the correct procedure. So if I change self.rec_locked and self.vu_locked from the code above to be Condition objects is it correct to do: thread 1: vubuffer = [] recbuffer = [] while self.running: data = self._audioobj.read(self._fragsize)# read data from soundcard vubuffer.append(data) if self.vu_locked.acquire(blocking=0): self.vubuffer += vubuffer vubuffer = [] self.vu_locked.release() if self.recording: recbuffer.append(data) if self.rec_locked.acquire(blocking=0): self.recbuffer += recbuffer recbuffer = [] self.rec_locked.release() thread 2: while self.recording: # wait a moment until there is something in the buffer to be written time.sleep(0.1) data = [] if self.rec_locked.acquire(blocking=0): data = [x for x in self.recbuffer] self.recbuffer = [] self.rec_locked.release() for d in data: self._waveobj.writeframesraw(d)# write the data to a file Thanks Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] GUI Development - Which toolkit
On Mon, 6 Feb 2006 09:44:48 -0500 Paul Kraus [EMAIL PROTECTED] wrote: I am developing applications that need to run without work on both windows and linux and was wondering what gui toolkits everyone uses and why. I have been looking at wxpython and tkinter. I have only used Tkinter so far, so I cannot say much about wx. Tkinter's biggest disadvantage is that some advanced widgets are missing, like a spreadsheet widget or a html viewer. There is also no built-in dragdrop support. A lot of these things are available by installing extension modules, though. If you don't need any of these Tkinter is worth a try; it is well documented, stable and easy to learn, and the biggest advantage over other toolits, it is included in the standard python distribution. If you want to use Tkinter you should also have a look at Tix, which is now included in python's windows installer (and also in any recent linux distro) and which adds a lot of nice extra widgets to Tkinter, like Combobox and Tree widget. A good place to find out more about Tkinter is the wiki: http://tkinter.unpythonic.net/wiki/FrontPage. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] Using ioctl
Hello, I am writing an app that records from the soundcard using ossaudiodev. In the OSS programmer's guide they recommend when reading data fragments from the soundcard to use the fragment size as it is requested by the driver. According to the programmer's guide the ioctl call to determine the requested fragment size is: int frag_size; if ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, frag_size) == -1) error(); Unfortunately this procedure is not implemented in the ossaudiodev module, so I tried to write it myself. From reading the fcntl module's docs, I came to the following solution: try: f = array.array('h', [0]) fcntl.ioctl(audio_fd, ossaudiodev.SNDCTL_DSP_GETBLKSIZE, f, 1) frag_size = f.tolist()[0] except: frag_size = -1 if frag_size = 0: frag_size = 4096 This *seems* to work, I tried several soundcards and got frag_size values like 4096, 8192 or 16384 . However I am not really sure about what I am doing there, so I would feel more confident if anyone could explain how ioctl is supposed to be used ( I also felt that I should use the try...except block for the call in case it fails, but I don't have an idea except *what*). Any hints are much appreciated. thanks in advance Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] First steps with Tkinter
On Thu, 26 Jan 2006 18:20:48 + [EMAIL PROTECTED] wrote: root.mainloop() I am running from inside Pythonwin 2.4 IDE under XP Pro and every time I run hello2.py it freezes when I press QUIT. The only way to kill it is through Alt-Ctrl-Del but this crashes Pythonwin. Any workaround for this so that I can use Tkinter from inside the IDE? BTW the same thing happend with IDLE Hi, when running Tkinter apps from IDLE or Pythonwin, you need to comment out the call to mainloop() . This is because the IDE itself runs a Tkinter mainloop() and two of these cannot coexist in one process. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter help required
On Wed, 14 Dec 2005 15:05:07 +0200 Vlad Popescu [EMAIL PROTECTED] wrote: Hi Vlad, Hello everyone, I have been desperately trying to get Tkinter to run, but without much success thus far. I've followed the instructions at http://wiki.python.org/moin/TkInter ; importing _tkinter does not work and I have no idea what files I should edit in order to add the module. Both Tcl and Tk, along with their -devel packages, are installed and updated. Python version is 2.4.1 it looks like you are running a linux box? If so , probably Tkinter is in a separate package that may be called tkinter or python-tk or something similar, depending on the distro. May be this package is not installed? Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Is it a good idea to use TKInter to change my password program into a GUI?
On Fri, 2 Dec 2005 15:20:43 -0700 Nathan Pinno [EMAIL PROTECTED] wrote: I like the Toolkit, is there anywhere where there is a how to use it? A good place to look for Tkinter resources is the wiki: http://tkinter.unpythonic.net/wiki There is a number of links to Tkinter documentation there: http://tkinter.unpythonic.net/wiki/Tkinter And still the best resource on Tkinter programming is John Grayson's Python and Tkinter programming: http://www.manning.com/books/grayson Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] tkFileDialog bug on windows
On Fri, 2 Dec 2005 16:58:26 -0800 Fred Lionetti [EMAIL PROTECTED] wrote: Hi everyone, I may have found a strange bug with tkFileDialog, and I'm wondering if anyone has a workaround for the problem. It happens when you have a button (or any other clickable widget) directly behind the askopenfilename dialog box and double click on a file. The button (behind the open file dialog) gets clicked, when it shouldn't. It occurs with the code below (but only under windows). -- from Tkinter import * import tkFileDialog def cmd(): print button was pressed parent = Tk() Button(parent, text = hello, command = cmd, width=30, height = 10).pack() tkFileDialog.askopenfilename(parent=parent, title = Double click on a file with the 'hello' button directly behind) parent.mainloop() - Hi Fred, I don't have a windows box here to try it, so I can just guess. On my linux box the list in the dialog responds to ButtonRelease events, but I think on windows tk uses native dialogs, and maybe these respond to ButtonPress events; if this is the case, it may happen that the ButtonRelease occurs *after* the dialog window has been destroyed, so the event gets delivered to the button in the parent window. Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Unicode trouble
On Wed, 30 Nov 2005 13:41:54 -0500 Kent Johnson [EMAIL PROTECTED] wrote: This is the full error: Traceback (most recent call last): File C:\Python23\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py, line 310, in RunScript exec codeObject in __main__.__dict__ File C:\Python\BA\Oversett.py, line 47, in ? File C:\Python\BA\Oversett.py, line 23, in kjor en = i.split('\t')[0] File C:\Python23\lib\codecs.py, line 388, in readlines return self.reader.readlines(sizehint) File C:\Python23\lib\codecs.py, line 314, in readlines return self.decode(data, self.errors)[0].splitlines(1) UnicodeDecodeError: 'utf8' codec can't decode bytes in position 168-170: invalid data This is fairly strange as the line en = i.split('\t')[0] should not call any method in codecs. I don't know how you can get such a stack trace. The file f where en comes from does contain lots of lines with one english word followed by a tab and a norwegian one. (Approximately 25000 lines) It can look like this: core\tkjærne Yes, I understand that. So en is supposed to be the english word that the program need to find in MS Word, and to is the replacement word. So wouldn't that be a string that should be handeled by codecs? for i in self.f.readlines(): en = i.split('\t')[0] The thing is, it's the line for i in self.f.readlines(): that is calling the codecs module, not the line en = i.split('\t')[0] but it is the latter line that is in the stack trace. Can any of the other tutors make any sense of this stack trace? As far as I see here, isn't the line return self.decode(data, self.errors)[0].splitlines(1) causing the traceback? I haven't read all of this thread, but maybe you are trying to pass a non-utf8 string to the utf8 codec? Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Is it a good idea to use TKInter to change my password program into a GUI?
On Tue, 29 Nov 2005 13:48:21 -0700 Nathan Pinno [EMAIL PROTECTED] wrote: Hey Danny and all, Alberto told me that there was a password entry box in TKInter. Can anyone tell me about that, please? Hi Nathan, maybe he meant the Pmw.PromptDialog (http://pmw.sourceforge.net/doc/PromptDialog.html) ? Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Creating Tkinter Menubars
On Tue, 15 Nov 2005 16:17:53 -0500 Double Six [EMAIL PROTECTED] wrote: Hi, I am testing the following Tkinter code (attached at the end of this message) by Fredrik Lundh on a Mac OS X 10.4.2 with Python version 2.3. I do get a root window, but it is totally blank without the desirable menubars such as File and Edit. What am I missing? snip It works well for me (on linux, python-2.3), maybe a mac specific thing (sorry , I can't help then). Does the following, simpler code work for you? from Tkinter import * root = Tk() menubar = Menu(root) menu = Menu(menubar, tearoff=0) menubar.add_cascade(label=File, menu=menu) menu.add_command(label=New) menu = Menu(menubar, tearoff=0) menubar.add_cascade(label=Edit, menu=menu) menu.add_command(label=Cut) menu.add_command(label=Copy) menu.add_command(label=Paste) root.config(menu=menubar) root.mainloop() The only thing that looks a little starnge to me in the original code is that the menubar is created as a child of the AppUi class, which is basically a Frame, but then it is attached to that Frame's parent (the root window). Maybe the mac doesn't like this (just a thought)? Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter mainloop (was Re: tkFileDialog.Directory)
On Wed, 16 Nov 2005 10:55:24 +0100 (MET) [EMAIL PROTECTED] wrote: Hi Karsten, I thought the mainloop() function is something like def mainloop(): e= get_event() if e: for w in widgets: w.handle(e) but apparently it is not. It's not bad that the Tkinter windows don't destroy upon an exception, since it gives me the option to display an error window, but I feel unsafe unless I understand why it does not. I am not enough of an expert to give you a complete answer for that, so anyone please correct me if I am wrong. As far as I understand, the mainloop() command just starts a tk shell and Tkinter gives you an interface to communicate with this tk shell. In fact Tkinter translates any widget command into a tk command and sends it to the tk shell, which itself sends it to the associated Tk window (or the related widget). The tk shell will run as long as a - Python decides to close it for you (e.g. after the main (Tk()) window has been destroyed) b - you explicitely close it calling the widget's quit() method c - a fatal tk error occurs, so the tk shell decides to quit itself Now most of the errors that occur happen of course on the python level and are caught by the python interpreter (that shows you the traceback) and there is no reason for python to inform the tk shell that it should quit. I hope this makes sense Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] tkFileDialog.Directory
On Tue, 15 Nov 2005 17:03:24 +0100 (MET) [EMAIL PROTECTED] wrote: I would like to ask another question. I don't understand the exception mechanism of Python when running a Tkinter app. If an exception happens (it does happen quite often at the moment..), a traceback is written to the console while the Tk window remains open and the application is still running. This is not what I expected -- I expected the application would end. Why is that? Is there a way to create an error handler for uncaught exceptions in Tkinter apps? In other words, can I change the behaviour from writing a traceback to the console to something else? Can I, for example, show a message box instead? If you only want to see the traceback in your gui, I recommend using Pmw. Pmw pops up a Text window that shows the complete traceback, it doesn't catch the exception though. Here is a small example: --- snip --- import Tix def raise_exception(): print 1/0 if __name__ == '__main__': root = Tix.Tk() root.title(Exception demo) Tix.Button(root, text = Don't press, command = raise_exception).pack() try: root.mainloop() except: print An error has occured. --- snip --- The except part gets never executed. That's because the error isn't in the mainloop() method. Probably you meant something like def raise_exception(): try: print 1 / 0 except ZeroDivisionError: print An error has occured. # or with a message box: # tkMessageBox.showerror(message='ZeroDivisionError') ? Thank god python is nice enough to raise the error where it actually happens; imagine your example would work, you would never know *where* the error happened nor could you create adequate handlers for different exceptions in different situations. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] tkFileDialog.Directory
On Mon, 14 Nov 2005 14:42:27 +0100 (MET) [EMAIL PROTECTED] wrote: Hello! I want to learn Tkinter and try to build a small File search dialog. Tkinter is nice, but here is a problem where I am stuck: I want to allow the dialog's user to pick a directory. The widget for this is tkFileDialog.Directory. But when I start the Directory-Window, it is possible move the focus back to my File Search dialog. Thus it is possible but not wanted to create several Pick directory windows. I tried to make the Directory instance modal by calling .grab_set() but this raises an attribute error. Here is a minimal example: Hi Karsten, I guess the tkFileDialog.Directory class isn't intended to be used directly. Try tkFileDialog.askdirectory() instead. If there are problems with the grab state, try passing parent=self.top to askdirectory(). I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] TKinter Question
On Tue, 08 Nov 2005 00:10:16 -0600 Rob Dowell [EMAIL PROTECTED] wrote: Just a quick TKinter question. Is it possible to have custom frames/widgets? In other words can I customize the way that the GUI looks (i.e. rounded corners on the frames, beveled/raised edges, etc.) I was just wondering if it was possible and if it is possible then where I might get some information on how to do it. Thank you very much, Rob. Hi Rob, I'm not sure what you mean with beveled/raised edges , maybe setting the widget's relief to GROOVE or RIDGE does what you want? Rounded corners are much more complicated; you will probably need the shape extension for Tk which adds non-rectangular window support to Tk. A version of shape that works with unix systems is included in the tkdnd drag and drop extension (http://sourceforge.net/projects/tkdnd); I wrote a Tkinter wrapper for tkdnd (http://www.8ung.at/klappnase/TkinterDnD/TkinterDnD.html) that makes it possible to use tkdnd from python. If you need windows support, you can try a newer version of shape (http://www.cs.man.ac.uk/~fellowsd/tcl/shapeidx.html) that seems to support windows platforms, too. Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] New image with Tkinter?
On Mon, 10 Oct 2005 11:36:22 -0600 Joseph Quigley [EMAIL PROTECTED] wrote: Hi, I've written an image reader that uses the PIL module. I have a variable that uses os.listdir('mydir') to make a list of all the pictures in the folder... here's what I'm talking about: (...) The image won't refresh when I click on 'Next'! Any help would be appreciated. Joe Hi Joe, the image won't refresh until you explicitely tell Tk to do so, so you would have to do some more in newPic(); btw, it looks overly complicated to me to use a Data class where a simple variable will do the trick, so I would suggest to change the code like this: pics = os.listdir(imgDir) pics.remove('license.txt') pics.remove('gacor.py') print There are %s saved images in the image folder. % len(pics) pic = 0 root = Tk() root.title(GaCoR Image Browser) app = Frame(root) app.grid() imgPrep = ImageTk.PhotoImage(file=os.path.join(imgDir, pics[pic])) imgShow = Label(app, image=imgPrep).grid() info = Label(app, text=Displaying %s % pics[Data.pic]) info.grid() def newPic(): global pic pic = pic + 1 imgPrep.configure(file=os.path.join(imgDir, pics[pic])) Button(app, text=Next Image, command=newPic).grid() Button(app, text=Close, command=quitProg).grid() app.mainloop() I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Focus in tkinter
On Wed, 14 Sep 2005 19:58:07 +0100 (BST) David Holland [EMAIL PROTECTED] wrote: I want to make the mouse focus in a GUI move to the correct button/text entry widget. Does anyone know how to do this ? Hi David, to set the focus to a particular widget you need the focus_Set() method: b = Button(parent) b.focus_set() Maybe you want to have a look at Frederik Lundh's excellent Tkinter books: http://www.effbot.org/tkinterbook or the more complete, but a little outdated version: http://www.pythonware.com/library/tkinter/introduction/index.htm I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] upgrading from 2.3 to 2.4.1 on Mandrake Linux 10.1
On Mon, 12 Sep 2005 07:35:52 -0500 Andy Dani [EMAIL PROTECTED] wrote: Hi, Which is the best location to install Python in Linux? Should it be under one directory or different (like lib, doc, bin etc.)? I followed installation instructions in inst.pdf from python documents. I can see that Python 2.4.1 has been installed in /user/lib/local by standard installation procedure. When I launch my IDLE or Python at shell, Python 2.3 comes up! Why? Do I need to upgrade any other config files? Also, I am looking for help in upgrading xwPython package, OpenGL package, and installation of BOA constructor. They go in which directories? Hi Nirav, I recommend not to *upgrade* the existing python installation but simply install a second version. The reason is that some system specific programs may depend on python-2.3 or one of the extensions that are already installed. If you are running Mandrake the best bet is to download mandrake's source rpm from http://fr2.rpmfind.net//linux/RPM/cooker/cooker/SRPMS/main/python-2.4.1-3mdk.src.html and build the binary RPM from it. After installing the RPM you should make sure that the link /usr/bin/python points to /usr/bin/python2.3 . If you want to run the new python, just type python2.4 (or in your scripts use the shebang line #!/usr/bin/env python2.4 ) (this should work if you already installed python-2.4 into /usr/local , too). WxPython and OpenGL should probably be installed into the python2.x/site-packages directory, BOA is (as far as I know) pure python and can be installed anywhere; if you want to run BOA with python-2.4 you will probably have to edit the shebandg line in BOA's main program file (or type python2.4 boa (or however the main program is called). Maybe you can find mandrake source RPM's for these, too, which might make it easier for you to install everything in the correct place. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] how to make a script do two things at once.
On Sun, 21 Aug 2005 16:23:20 -0500 nephish [EMAIL PROTECTED] wrote: Hey there, i have a simple question about getting a script to do two things at once. like this. for i in range(100): print i time.sleep(.2) if i == 15: os.system('python /home/me/ipupdate.py') print 'done' when i run this, it stops at 15 and runs the script called out in the os.system line. i know it is supposed to do that. But, how could i get a script to do this without stopping the count (or delaying it unill the script called exits) I don' t have to run it this way, i can import it if necessary as a module. or whatever will work so i can execute two things at once. If you just need to call a unix system command you can simply add to the command string to make it run in the background. Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] convert a file from plaintext(Ascii) to unicode? very quickquestions
On Mon, 15 Aug 2005 22:51:20 -0400 Kent Johnson [EMAIL PROTECTED] wrote: I think Luke's suggestion will work if you use f.read() (to read the whole file as a single string) instead of f.readlines() and f.write() instead of writelines(). Kent And if you want to convert ascii into unicode you need to call * decode() * ( which does pretty much the same as unicode() ) on the string, not encode() . Michael luke wrote: List: I'm forwarding this private message(hope you don't mind Denise) I personally have no idea what to do, but someone else might be able to help. -Luke - Forwarded Message - text is a list, so you can't encode it. but you can iterate over each of the elements and encode them. I have tried several variations of that, but keep ending up with all my newlines being little boxes. any ideas? Thanks, Denise On 8/15/05, luke [EMAIL PROTECTED] wrote: I dont know much about Unicode but it seems like f = file(filename, r) text = f.readlines() text = text.encode() #or maybe just text.encode()? f.close() should encode the filetext to unicode. then you could do a f = file(filename, w) f.writelines(text) f.close() ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter event for changing OptionMenu items
On Thu, 21 Jul 2005 14:16:05 -0400 Bernard Lebel [EMAIL PROTECTED] wrote: Hi Michael, Let say I have a MenuOption, that consists of 3 items. This MenuOption sits on top of the Tkinter window. In the lower part, I have a bunch of widgets (text fields). When the choose a different item from the MenuOption, it would call a function that clears the lower part and repopulates it with new fields. My problem is binding this callback to the event of choosing an item. In this case I would try the StringVar()'s trace method, which you can use to track changes of its value; a simple example: from Tkinter import * root = Tk() s = StringVar() s.set('a') om = OptionMenu(root, s, 'a', 'b', 'c', 'd') om.pack() def changed(*args): ... print s.get() ... s.trace('w', changed) In the example changed() is called each time you select an item in the menu and with s.get() you can query the current selection and update the window according to the current value. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] ListBox in Tkinter
On Mon, 18 Jul 2005 17:54:34 +0200 geon [EMAIL PROTECTED] wrote: Alan G napsal(a): I would like to ask if it is possible to create such a listbox (attached) in TKinter itself or must have pmw ot tix...or ... PMW is written in Tkinter so yes, you could do it yourself but it is not a native widget. Using PMW would be much easier! I have just found this: http://effbot.org/tkinterbook/optionmenu.htm - that is nearly what I needed , just another design. I think there are even other new widgets in new Tk/Tcl compared to the http://www.pythonware.com/library/tkinter/introduction/, but undocumented yet. Or poorly or only in original Tk documentation. There are three new widgets in Tk 8.4: the Spinbox (an entry field with up and down arrow buttons), the PanedWindow , which lets you dynamically add resizable frames and the LabelFrame, a Frame with a decorative border and a Label in one of its corners. Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Scrolling multilistbox help
On Mon, 18 Jul 2005 13:54:45 + Alberto Troiano [EMAIL PROTECTED] wrote: Hey tutors I'm using the Multilistbox class and I noticed that it only handles the mouse scroll and the scrollbar to go down or up.I succesfully implemented the sort function that came with the class I also added code to handle the up and down arrow keys and it goes down all right but only select the item and it doesn't scroll down or up How can make it go up or down? I'm sendind the class here: Hi Alberto, I haven't tested your code, but if I understand you correctly, the problem is that the list is not automatically scrolled when you select a new item with the Up and Down keys (right?). Maybe it's the easiest to add a line like this to your _select1() and _select2() methods: l.see(int(l.curselection()[0])) where l is the first of the listboxes; this should make sure the selected item is visible (at least if you use selectmode=SINGLE). If keeping all lists in sync works, this should be enough to scroll all other lists, too (like I said, untested though). I hope this helps Michael class MultiListbox(Frame): fila=0 sortedBy=-1 def __init__(self, master, lists): Frame.__init__(self, master) self.lists = [] for l,w,a in lists: frame = Frame(self,background=red); frame.pack(side=LEFT, expand=YES, fill=BOTH) Button(frame,background=red,foreground=white,font=Verdana 8 bold,text=l, borderwidth=1, relief=RAISED,command=lambda a=a: self._sortBy(a)).pack(fill=X) lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0, relief=FLAT, exportselection=FALSE) lb.pack(expand=YES, fill=BOTH) self.lists.append(lb) lb.bind('B1-Motion', lambda e, s=self: s._select(e.y)) lb.bind('Double-Button-3', lambda e, s=self: s._devolverfila(e.y)) lb.bind('Return', lambda e, s=self: s._devolverfila(e.y)) lb.bind('Button-1', lambda e, s=self: s._select(e.y)) lb.bind('Down', lambda s: _select1()) lb.bind('Up', lambda s: _select2()) lb.bind('Leave', lambda e: 'break') lb.bind('B2-Motion', lambda e, s=self: s._b2motion(e.x, e.y)) lb.bind('Button-2', lambda e, s=self: s._button2(e.x, e.y)) frame = Frame(self,background=red); frame.pack(side=LEFT, fill=Y) Label(frame,background=red,foreground=white,font=Verdana 8 bold, borderwidth=1, relief=RAISED).pack(fill=X) sb = Scrollbar(frame,background=red, orient=VERTICAL, command=self._scroll) sb.pack(expand=YES, fill=Y) self.lists[0]['yscrollcommand']=sb.set def _sortBy(self, column): Sort by a given column. if column == self.sortedBy: direction = -1 * self.direction else: direction = 1 elements = self.get(0, END) self.delete(0, END) elements.sort(lambda x, y: self._sortAssist(column, direction, x, y)) self.insert(END, *elements) self.sortedBy = column self.direction = direction def _sortAssist(self, column, direction, x, y): if column!=0: c = cmp(x[column], y[column]) if c: return direction * c else: return direction * cmp(x, y) else: c = cmp(int(x[column]), int(y[column])) if c: return direction * c else: return direction * cmp(x, y) def _select(self, y): row = self.lists[0].nearest(y) self.selection_clear(0, END) self.selection_set(row) self.fila=row return 'break' def _devolverfila(self, y): row = self.lists[0].nearest(y) self.selection_clear(0, END) self.selection_set(row) self.fila=row def _select1(self): if self.fila==self.size()-1: pass else: self.selection_clear(0, END) self.selection_set(self.fila+1) self.fila+=1 self._scroll() return 'break' def _select2(self): if self.fila==0: pass else: self.selection_clear(0, END) self.selection_set(self.fila-1) self.fila-=1 return 'break' def _button2(self, x, y): for l in self.lists: l.scan_mark(x, y) return 'break' def _b2motion(self, x, y): for l in self.lists: l.scan_dragto(x, y) return 'break' def _scroll(self, *args): for l in self.lists: apply(l.yview, args) def curselection(self): return self.lists[0].curselection() def delete(self, first, last=None): for l in self.lists: l.delete(first, last) def get(self, first, last=None): result = [] for l in self.lists: result.append(l.get(first,last))
Re: [Tutor] HTML links from Tkinter
On Fri, 15 Jul 2005 10:55:37 +1200 (NZST) [EMAIL PROTECTED] wrote: There's no table widget in standard Tkinter. Search in the Python Cookbook (on ActiveState) for a MultiListbox; it might do what you need. -- On the Tkinter wiki there are some links to Tkinter table widgets (I have not tried any of these though): http://tkinter.unpythonic.net/wiki/Widgets Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tk -- which label clicked
On Fri, 15 Jul 2005 23:29:22 +1200 (NZST) [EMAIL PROTECTED] wrote: Quoting Michael Lange [EMAIL PROTECTED]: I don't think it will work this way, because you don't catch the event bind() passes to the callback (you also use a variable e in makeCallback() that isn't defined anywhere). That's what the variable 'e' is doing! Here is some code I just wrote and tested: def clicked(w): ... print 'Widget %s clicked! Text: %s' % (str(w), w.cget('text')) ... def makeCallback(w): ... def callback(e): ... clicked(w) ... return callback ... Aah, you're right, I guess I got confused a little. Still I think it's overly complicated in this context, when you can you get the same result with: def makeCallback(event): print Widget %s clicked! Text %s % (str(event.widget), event.widget['text']) Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter Q's
On Wed, 13 Jul 2005 08:13:42 + Joseph Quigley [EMAIL PROTECTED] wrote: Hi, what's the **kw stand for, used for? What does it mean? **kw means that there is an optional list of keyword arguments that you can pass to __init__ (for example: main = Main(background=black) ). Keyword, because there is defined set of keywords that may be used. Here's what I would do: class Main(Frame): def __init__(self, master=None, **kw): Frame.__init__(self, master, **kw) showquote = Label(self, text=random.choice(quotes.quote)) showquote.pack() # etc if __name__ == '__main__': root = Tk() main = Main(root) main.pack(fill=BOTH, expand=True) root.mainloop() ### Do you see what I am doing there, and why it is different from your approach? Uh, not really, no. I'm very new to GUI. So you're saying that If I make the class actually do something (I edited and example in: An into to Tkinter, Fredrik Lundh). O.k., let's try it in more detail class Main(Frame): def __init__(self, master=None, **kw): Frame.__init__(self, master, **kw) This defines a new class Main; the construct Main(Frame) means that Main is a subclass of Frame and so inherits all methods and other attributes of a Frame (like pack(), configure() and so on). The second line defines the classes __init__() method, which is called everytime you create a new instance of the Main class with e.g. main = Main() . There are three arguments passed to __init__() : self is the first, because everytime you call a class method, the first argument that is passed to the call is the class instance that does the call, e.g if you do root.mainloop() , the mainloop() method gets called with your root window as first argument. You actually don't need to call this variable self, you could as well call it joe, but everyone uses self, and this makes sense, because it points to what is meant. The third line now is the first thing __init__() does: it calls the Frame's __init__() and passes self as first argument to it, so now actually when you do: main = Main() your variable main is set to what your __init__() method returns and this is at this point nothing else as that what Frame.__init__() returns - a newly created Frame instance. You see, all arguments that are passed to __init__() are passed to Frame.__init__(), so after these three lines The Main class is nothing more (or less) than a Frame. I hope this made sense so far. Now you are ready to add some useful features to your class, to make it more than a standard Frame; e.g. start with adding some widgets and one new class method: class Main(Frame): def __init__(self, master=None, **kw): Frame.__init__(self, master, **kw) self.label = Label(self, text=Hello) self.label.pack() self.button = Button(self, text=Change quote, command=self.change_quote) self.button.pack() def change_quote(self): if self.label['text'] == Hello: self.label.configure(text=World) else: self.label.configure(text=Hello) You see, we added a Button and a Label to the Frame. As first argument we passed self to the widgets, which, you remember, is a Frame instance; by calling the variable self.label instead of just label however you did some more: you added a new attribute to the Frame instance. the advantage is that you now can access the label from the outside: root = Tk() main = Main(root) main.pack() main.label.configure(text=Foo) root.mainloop() changes the Label's text. The last thing is that you defined a new class method for the Main class: change_quote() You see, change_quote() is defined *outside* of __init__() (note the indentation level), so it becomes another class attribute, just as __init__() itself and all the methods inherited from Frame. You can try: root = Tk() main = Main(root) main.pack() root.after(3000, main.change_quote) root.mainloop() Here when you call main.change_quote the class instance is passed as first argument to the method, that's why you have to pass self as argument in the class method definition, basically the same as with __init__(), and that's why you have to use self.change_quote as command for the button. I hope this still made sense. def changeQuote(): currQuote = showquote.cget('config') # Get the current quote newQuote = random.choice(quotes.quote) while newQuote == currQuote: # Make sure the new quote differs newQuote = random.choice(quotes.quote) showquote.config(text=newQuote) Button(self, text='Show another quote', command=changeQuote).pack() Aaag. I'm confused... I just tried you changeQuote example with out the above stuff... didn't work. My error message: AttributeError: 'NoneType' object has no attribute 'config'
Re: [Tutor] Tkinter Q's
On Mon, 11 Jul 2005 17:22:57 + Joseph Quigley [EMAIL PROTECTED] wrote: Hi, Joseph, Hi first off, here's my code: # -*- coding: utf-8 -*- from Tkinter import * import random import time import about import quotes def closeprog(): raise SystemExit class main: root = Tk() frame = Frame() root.title(Quoter %s % (about.ver)) root.minsize(300, 50) showquote = Label(root, text=random.choice(quotes.quote)) showquote.pack() exit = Button(root, text=Exit, command=closeprog) exit.pack(side=LEFT) aboutprg = Button(root, text=About, command=about.main) aboutprg.pack(side=LEFT) totalq = Label(root, text=quotes.qts) totalq.pack(side=BOTTOM) root.mainloop() (I'd appreciate some suggestions, or notifications on how bad something is) I think you should change the way you define the main class, so you keep references to the class attributes; it looks like your main class fires up a Tk() window, so it's probably best to subclass Tk() : class Main(Tk):# this doesn't really matter, but upper case letters are generally preferrred for class names def __init__(self, *args, **kw): Tk.__init__(self, *args, **kw) # at this point the Main() class practically is a Tk(), so it can be handled just like a regular # Tk() window from the outside; the *args, **kw construct allows to pass an arbitrary amount of # arguments and keyword arguments to the parent class. self is a placeholder for the class instance # that will be actually used in the code. # To get a benefit over a normal Tk() window you can now start adding attributes: self.showquote = Label(self, text=random.choice(quotes.quote)) self.showquote.pack() etc. # of course you can use the parent classes methods on self, too: self.title(Quoter %s % (about.ver)) self.minsize(300, 50) # now you can add a button which uses a class-specific command: self.switchbutton = Button, text=Switch quote, command=self.switch_quote) self.switchbutton.pack() # finally the class method has to be defined: def switch_quote(self): newquote = get_the_new_quote()# it's up to you how to do this of course self.showquote.configure(text=newquote) Now the Main() class can be used like a regular Tk() : root = Main() root.mainloop() And for something completely different: be careful mixing pack(side = LEFT / RIGHT) with pack(side = BOTTOM / TOP), you might not get the results you expected. For complex layouts you are probably better off using grid() ( or you will find that you have to use extra Frames to pack() your widgets in. I hope this helps Michael I have a small problem: I don't know how to make a button that would redisplay another quote in the same window, ie I need a button that says: Show Another Quote. (Actually I don't know how to make it show another quote even in a new window!!). I got the interface from Catfood Fortune Cookie. Here's a tid-bit of the quotes module: # Brian Kernighan bk1 = Controlling complexity is the essence of computer programming. -- Brian Kernighan yadayada = Foo/bar quote = [bk1, yadayada] Thanks, Joe -- Unix Love, Linux Pride ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Process problem
On Wed, 15 Jun 2005 22:04:48 + Alberto Troiano [EMAIL PROTECTED] wrote: Hi Alberto, Hey Let me make you understand I need that levantamuertos.py run cotascamon.py (every script with it differents arguments that are passed) and then die letting the cotascamon.py scripts running independently Now, I don't know if my code is right, and thinking now you're right, levantamuertos.py waits until cotascamon.py finish. What can I do since cotascamon will never die (and it doesn't have to die)? Maybe a different approach will be the solution but I can't find a way to do it Best Regards Alberto I didn't follow the thread completely, so maybe I missed something, but if the problem is that python waits until the os.system() calls are finished, I think adding a to the command to make it run in the background should do the trick. Best regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] finding path to resource files in a GUI application
On Thu, 9 Jun 2005 08:52:59 +0200 Christian Meesters [EMAIL PROTECTED] wrote: Hi Currently I'm writing a GUI application with wxPython (on OS X, but I guess the problem is the same, regardless of the UNIX derivative one is using). When I start the main script where it is located the application finds all resource files (non-Python files like images and html files for html windows) without any problem. However, if a put a link in /usr/local/bin and start the script using the link the application cannot find those resource files - unless, of course, I will use full absolute paths to point to those files. One brief example to illustrate the problem: The class Goals is in a file called Help.py, located in '/gui_lib/' as seen from my main script. class Goals(wx.Frame): def __init__(self,parent,frame,title,size,pos=wx.DefaultPosition): wx.Frame.__init__(self,parent, -1,title,size,style=wx.DEFAULT_FRAME_STYLE) self.frame = frame self.cwd = os.getcwd() self.html = HtmlWindow(self,-1) self.html.LoadPage(os.path.join(self.cwd,'gui_lib/Goals.html')) #this, of course, won't work #if the main script is called from somewhere else and not the directory where the main script #is located Any ideas what I could use instead of os.getcwd to construct a relative path which will work even if I port the script to an other machine? Cheers Christian Hi Christian, try self.cwd = os.path.abspath(sys.path[0]) sys.path[0] is the directory of your main program file, with os.path.abspath() you can get rid of the ../../ stuff at the beginning of the path if the program is called from a link. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] help me on python + snack
On Tue, 17 May 2005 21:18:09 -0700 (PDT) Mahmad Sadique Hannure [EMAIL PROTECTED] wrote: Hi Mahmad, Hello friends, I m currently working on sound stuff. I have installed all stuff related to Snack. My code for playing mp3 song is like this #!/usr/bin/python2.3 from Tkinter import * import tkSnack def main(): root = Tk() tkSnack.initializeSnack(root) mysound = tkSnack.Sound('xyz.mp3') I believe the last line is the problematic one. Try to change it into: mysound = tkSnack.Sound(file='xyz.mp3') #mysound.read() mysound.play() if __name__=='__main__': main() I works fine without any error but can't get any sound. So friend help me, I don't know whats wroung with my code. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter and Animation
On Wed, 27 Apr 2005 19:31:06 -0700 Jeremiah Rushton [EMAIL PROTECTED] wrote: I tried your idea and it doesn't animate it. I made a for loop and told it to mover 1 pixel downward every .3 seconds for 25 times. It just waits till the for loop is completed and then displays the result of the loop ending. I also tried it without the for loop by writing each one of the steps out repetively and I had the same result. The only thing that has kind of got close to the visual is that I wrote a program that everytime the user clicked the button it moved down one pixel, but I want it to move 100 pixels, one by one, with only one click from the user. Here's the code that I wrote: from Tkinter import * from time import sleep class Main: def __init__(self,master): button = Button(master,text='button') button.place(x=1,y=1) y=3 for x in range(1,25): sleep(.3) button.place_forget() button.place(x=1,y=y) y+=2 root = Tk() Main(root) root.title('test') root.mainloop() Thanks for all the help so far. Jeremiah Hi Jeremiah, you should call update_idletasks() to make the changed geometry visible. I've written a (very quick and dirty) demo that shows how to animate a Label with place() : ### from Tkinter import * class AnimatedFrame(Frame): def __init__(self, master, **kw): Frame.__init__(self, master, **kw) self.labelx = 100 self.labely = 100 self.label = Label(self, text='Look at me!') self.label.place(x=self.labelx, y=self.labely) self.button = Button(self, text='Start', command=self.start) self.button.place(x=100, y=200) def start(self): if self.labelx 20: self.labelx -= 1 self.labely -= 1 self.label.place(x=self.labelx, y=self.labely) self.update_idletasks() self.start() def test(): root = Tk() f = AnimatedFrame(root, width=300, height=300) f.pack() root.mainloop() if __name__ == '__main__': test() # I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Re: Tkinter and Animation
On Wed, 27 Apr 2005 09:35:47 -0700 Jeremiah Rushton [EMAIL PROTECTED] wrote: I wanted them to visually shrink and visually move to a corner on the frame. I did not know how to do it the way you explained, thanks for that. But is there any way to do it visually? I guess so, if you use the place geometry manager. With place() you can determine things like x- and y-coordinates on the parent widget and relative width / height, so if you start a loop that moves the button 2 pixels up and one pixel to the left every 50ms for example it might come close to the kind of animation you want. It's probably tricky, but I think it's possible. Best regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Problems with encodings
On Mon, 18 Apr 2005 09:22:28 +0300 Olli Rajala [EMAIL PROTECTED] wrote: Hi! Been offlist for a while, but now I started to code an administration tool for my own photo gallery and have some troubles, so thought to write and ask some help. :) So, I'm from Finland and I'm using ISO-8859-15 -encoding but Python don't understand letters outside ASCII. I've read PEP-0263 and tried to add the encoding line to my sources, but it doesn't help. Here's a little example: #!/usr/bin/python2.4 # -*- coding: iso-8859-15 -*- def printHeader(): print Don't know how you see the 4th line, but that's not my problem, is it? ;) And I got this error message: sys:1: DeprecationWarning: Non-ASCII character '\xe4' in file generalHtml.py on line 11, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details I code with Kate (2.4, KDE 3.4.0) and everything else works well when speaking about this encoding thing. I really hope that someone would know a solution. I don't mind if I have to write only ASCII but I'm not the only user for that tool, so... Hi Olli, does it help if you change the second line into: # -*- coding: iso-8859-15 -*- ? I *think* that is the correct syntax (at least it works for me). Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Entry widgets
On Sun, 10 Apr 2005 18:07:48 +1000 Diana Hawksworth [EMAIL PROTECTED] wrote: Hello list, Is it possible to change the width of an Entry widget - or not? I am using Tkinter, GUI - and have an Entry widget that accepts a number. I just don't want it to extend the width of the column. I have tried width = - but get an error. You should be able to use the width option as for any other widget: e = Entry(parent, width=5) or e.configure(width=5) What exactly did you write, and what was the error? Maybe a text widget would be preferable? If you just want one line to enter a number, I don't think so. Also - how do I set the insertion symbol there already, so I don't need to click there to enter the number? You can use focus_set(): e = Entry(parent) e.focus_set() TIA. Diana I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] using the enter key
On Thu, 07 Apr 2005 10:06:46 +1000 Nova Nova [EMAIL PROTECTED] wrote: def create_widgets(self): self.a_lbl=Label(self,text=,fg=Red) self.a_lbl.grid(row=0,column=0,columnspan=2,sticky=W) self.inst_lbl=Label(self,text=Enter A Number Between 1 and 100.,fg=blue) self.inst_lbl.grid(row=1,column=0,columnspan=2,sticky=W) self.pw_lbl=Label(self,text=Number: ) self.pw_lbl.grid(row=2,column=0,sticky=W) self.pw_ent=Entry(self) self.pw_ent.grid(row=2,column=1,sticky=W) self.submit_bttn=Button(self,text=str(self.g)+ Turns Left,command=self.reveal,fg=red,bg=black) self.submit_bttn.grid(row=3,column=0,sticky=W) self.win_txt=Text(self,width=35,height=5,wrap=WORD) self.win_txt.grid(row=4,column=0,columnspan=2,sticky=W) def submit(self): self.reveal entry.bind('Return',self.submit) this is what im doing and i get an error, IT DOES NOT WORK The problematic part is your submit() method: def submit(self): self.reveal# you forgot the parentheses here to call your reveal() method ^^ entry.bind('Return',self.submit) this only binds the event handler to the Entry when the submit button was pressed before; you better apply this binding in your create_widgets() method immediately after creating the Entry widget. Please note that if you want to use the submit() method both as button-command and as event handler for the entry, it needs an optional event instance as argument: def submit(self, event=None): (...) because the button's command doesn't pass an event to the callback, but the entry's event handler does. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] using the enter key
On Tue, 5 Apr 2005 06:28:54 +1000 Diana Hawksworth [EMAIL PROTECTED] wrote: Hello list! At the moment I have some user input tied to a button that allows the input to be submitted and then an answer is supplied. How can I get rid of this submit button, and have the user just press the enter key and have the same result happen? TIA. Diana You need to create an event handler for the Entry widget that is called each time the Enter key is pressed over the widget: entry.bind('Return', submit) where entry is of course your Entry widget and submit the function to be called. Please note that the enter key's event descriptor is 'Return' in Tk (there's an 'Enter' event, too, which is when the mouse pointer enters the widget) and that the callback gets an event instance passed, so the function definition has to look like this: def submit(event): (...) I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] wxPython / Tkinter Grid
On Fri, 1 Apr 2005 09:11:20 +0100 Alan Gauld [EMAIL PROTECTED] wrote: I know a wxPython grid is totally different to a Tkinter grid, but is there a Tkinter equivalent of a wxPython grid? I'm finding wxPython to be fiddly and restrictive... Then Tkinter will be more so. Tk is a fairly basic toolkit, fine for wrapping a command line app in a glossy front end but not for sophisticated GUI work. There is no grid component in Tk out of the box, but some add on toolkits supply one. Try searching on the Vaults of Parnassus or on the ActiveState site if you are determined to try Tkinter... Alan G. Or look here: http://tkinter.unpythonic.net/wiki/Widgets There is a number of links to table widget implementations in Tkinter o nthe wiki page. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Changing Keyboard output
On Sun, 20 Mar 2005 19:38:40 - Igor Riabtchuk [EMAIL PROTECTED] wrote: Hi, I am totally new to Python and still learning. I am looking for a way to change keyboard output within Tkinter widget - for example, say I press p and I want it to come out as t. Could anyone possibly point me in the right direction? Igor You can use the widget's bind() method to replace the standard callback with a new one: from Tkinter import * root = Tk() e = Entry(r) e.pack() def PtoT(event): e.insert('insert', 't') return 'break' e.bind('p', PtoT) the return 'break' statement prevents the event from being propagated to Tk's standard event handler; without it both p and t would be inserted into the Entry. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] help
On Mon, 07 Mar 2005 11:46:42 -0500 Kent Johnson [EMAIL PROTECTED] wrote: Gregory Sexton wrote: Thanks for the help! Sorry for the trivial questions, but I guess we all have to start somewhere. Beginning python student, OS Windows XP,using Python 2.4. Also novice to programming. I cant get the /a command to work. I don't know what the /a command is, please give more details. I get an elongated 0 in my Python interpreter, but no sound. Sound? Maybe you meant print \a ? Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Saving Entry fields in Tkinter
On Tue, 1 Mar 2005 12:52:57 +0100 Ewald Ertl [EMAIL PROTECTED] wrote: Hi! Perhaps this could help you: fileContent=open( my/file/to/read, r).readlines() for line in fileContent: print line.strip() # remove leading and trailing whitspace's incl. \n In the loop you could perhaps populate the entry-widgets. HTH Ewald Or use the fileinput module: var_list = [] for line in fileinput.input(filename): var = Tkinter.StringVar() var.set(line) var_list.append(var) Best regards Michael on Tue, 1 Mar 2005 09:22:06 + Adam Cripps [EMAIL PROTECTED] wrote : - Adam Cripps I'm writing an application which has rows of Entry fields (created in Adam Cripps a loop - see previous thread; and thanks guys!). All the content of Adam Cripps the Entry fields are accessed through self.contentlist[i].get() Adam Cripps Adam Cripps Now I'm trying to save the content of those fields in a friendly Adam Cripps format. I've used pickle in the past, but experienced problems with Adam Cripps pickling Tkinter widgets. Adam Cripps Adam Cripps I'm saving using this method :- Adam Cripps Adam Cripps for i in self.contentlist: Adam Cripps saving = i.get() + \n Adam Cripps f.write(saving) Adam Cripps f.close() Adam Cripps Adam Cripps which creates a text file with each entry field separated with a \n. Adam Cripps Adam Cripps What would be a good way to open this file and re-populate the entry Adam Cripps fields with the content? I'm not sure how to parse the text according Adam Cripps to the \n separator. Adam Cripps Adam Cripps Am I going down the right path here? Adam Cripps Adam Cripps TIA Adam Cripps Adam --- end -- -- Ing. Ewald Ertl HartterGruppe Phone : +43-3352-33085-558 trinomic Projektmanagement Informationstechnik GmbH Fax : +43-3352-33085-600 Wiener Straße 41mailto:[EMAIL PROTECTED] A-7400 Oberwart http://www.trinomic.com mailto:[EMAIL PROTECTED] ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Recursive Tkinter buttons
On Sat, 26 Feb 2005 19:48:25 + Adam Cripps [EMAIL PROTECTED] wrote: On Fri, 25 Feb 2005 12:21:18 +0100, Michael Lange snip You see, in my example above I called the list buttonlist instead of button; maybe this naming helps avoid confusion . Best regards Michael Many thanks for the help here. I got all my buttons displayed and stored in the list with: for i in range (1, 11): submittext = self.s = Button(text=submittext, command = self.showButton) self.s.grid(column=4, row=i+4) submitlist.append(self.s) Hi Adam, note that there's no use in making the button an attribute of its parent class with self.s = Button(text=submittext, command = self.showButton) because self.s gets overridden on every iteration in the for-loop; it's not a bug, but might be a source of confusion, when you try to access self.s later in your code; you don't need the reference anyway, because you keep the references to all buttons in the list. - however, when I click the button, I want self.showButton to know which one of them was pressed. I've seen in other gui programming the idea of an id or identifier - I can't see that here. Ideally, I would like to know the value of i in self.showButtons - but when I use self.showButtons(i) showButtons gets called straight at run time. Any ideas? You have two options here: 1. use a lambda expression as button command, lambda allows you to pass an argument to the callback: s = Button(text=submittext, command = lambda index=i: self.showButton(index)) 2. if you don't like lambdas, you can use the button's bind() method instead of the command option: s = Button(text=submittext) s.bind('ButtonRelease-1', self.showButton) s.bind('KeyRelease-space', self.showButton) bind() passes an event to the callback which allows you to find out which widget sent the event via the event's widget attribute: def showButton(self, event): button = event.widget print button['text'] I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Recursive Tkinter buttons
On Fri, 25 Feb 2005 20:19:15 +1300 Liam Clarke [EMAIL PROTECTED] wrote: for i in range(0,10): print i buttonlabel = field +str(i) button[i].append = Button (text=buttonlabel) button[i].grid(column=3, row = i+3) The current error is: File report.py, line 80, in createWidgets button[i].append = Button (text=buttonlabel) IndexError: list index out of range button = [] for i in range(0,10): print i print button[i] Will cause the exact same error as button[i].append. Why? button=[], it has no index. Perhaps you just mean button[i] = Button (text=buttonlabel)? Regards, Or : buttonlist = [] for i in range(0, 10): print i buttonlabel = field + str(i) b = Button(text=buttonlabel) b.grid(column=3, row=i+3) buttonlist.append(b) Remember what you are doing when you call button[i].append = Button(text=buttonlabel): button is a list of Tkinter.Button objects, so button[i] is the i-th item in this list and that's exactly one more than the list actually contains, so you get an IndexError . However, if this IndexError wouldn't occur, it didn't help much, because you would probably get an AttributeError, saying something like Tkinter.Button instance has no attribute 'append'. Even without this AttributeError nothing would be won, because the list's append() method returns None, so you would have: None = Button(text=buttonlabel) which is probably not what you intended. You see, in my example above I called the list buttonlist instead of button; maybe this naming helps avoid confusion . Best regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Unicode issues
On Thu, 24 Feb 2005 07:51:04 -0500 Kent Johnson [EMAIL PROTECTED] wrote: Michael Lange wrote: I *thought* I would have to convert the user input which might be any encoding back into byte string first How are you getting the user input? Is it from the console or from a GUI? It's a (Tkinter) gui, but anyway, I think I now understand why this idea is total nonsense. If your intent is to create a unicode string, try this: if not isinstance(result, unicode): result = result.decode(sys.stdin.encoding) Ok, user input must be checked whether it's unicode or not and if necessary be decoded to unicode with system encoding. For internal operations I should then use only unicode strings and if I need to print something to stdout I must encode it again with system encoding, right? This article gives a lot of good background: http://www.joelonsoftware.com/articles/Unicode.html I have written an essay about console encoding issues. At the end there is a collection of links to more general Python and Unicode articles. http://www.pycs.net/users/323/stories/14.html Kent That's great! Exactly the kind of articles I've been looking for but couldn't find. Thanks!!! Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] UnicodeDecodeError
On Tue, 22 Feb 2005 19:17:40 -0500 Isr Gish [EMAIL PROTECTED] wrote: This part of the error is saying what the problem is. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 22: ordinal not in range(128) Thatthe ascii codec that's being used can't decode any ascii code above 128. And the code 0xe4 is higher then that. You would have to use a different encoding, like msbc. If i remmeber correctly you should do something like the following. self.nextfile = self.nextfile.encode('msbc') Then it should work. If it doesn't work try posting what error you get. All the best Irr Thanks for the reply, it looks to me however that the problem is rather the gettext part; once I discovered this problem I can produce similar errors at other points in my app that *seem* to only occur when a gettext string gets combined with a string that is returned by user input from some Tkinter widget. The final complaint in the traceback is always about a (german) special character in the translated gettext string: ## UnicodeDecodeError Exception in Tk callback Function: function lambda at 0xb72ec304 (type: type 'function') Args: () Traceback (innermost last): File /usr/lib/python2.3/site-packages/Pmw/Pmw_1_2/lib/PmwBase.py, line 1747, in __call__ return apply(self.func, args) File /usr/lib/python2.3/site-packages/Pmw/Pmw_1_2/lib/PmwDialog.py, line 153, in lambda command=lambda self=self, name=name: self._doCommand(name)) File /usr/lib/python2.3/site-packages/Pmw/Pmw_1_2/lib/PmwDialog.py, line 132, in _doCommand return command(name) File /usr/local/share/phonoripper-0.6.2/widgets/FileSelectDialog.py, line 206, in go if not self.ok(): File /usr/local/share/phonoripper-0.6.2/widgets/FileSelectDialog.py, line 201, in ok return self.fo_handler.create_ok(self.full_path) File /usr/local/share/phonoripper-0.6.2/FileOperationHandler.py, line 43, in create_ok message=_('File already exists:\n%s\nDo you want to overwrite it?') % filename) UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 19: ordinal not in range(128) ## The german translation of 'File already exists:\n%s\nDo you want to overwrite it?' contains a special character ('\xfc'), filename is of course simply the complete path to a file as it is returned by a Save as... dialog box. I get this error for some reason if I choose '\xe4.wav' as basename for filename but not if I choose 'A\xe4.wav' . Like I said in my first post, there are no errors if I remove the german .mo file, so gettext uses the english strings. What seems really weird to me here is that it looks like both the translated gettext string and the special characters in my filename variable *can* be decoded, but not both at a time - but only under (rare) circumstances ( setting filename to /somepath/A\xe4.wav works but /somepath/\xe4.wav not). I'm really lost here, so any further hints are very appreciated. Thanks and best regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] UnicodeDecodeError
On Wed, 23 Feb 2005 07:21:40 -0500 Kent Johnson [EMAIL PROTECTED] wrote: This is a part of Python that still confuses me. I think what is happening is - self.nextfile is a Unicode string sometimes (when it includes special characters) - the gettext string is a byte string - to compare the two, the byte string is promoted to Unicode by decoding it with the system default encoding, which is generally 'ascii'. - the gettext string includes non-ascii characters and the codec raises an exception. Thanks Kent, now it looks like the total confusion seems to clear up (at least partially). After some googling it seems to me that the best bet is to use unicode strings exclusively. When I set the unicode flag in gettext.install() to 1 the gettext strings are unicode, however there's still a problem with the user input. As you guessed, self.nextfile is unicode only *sometimes*; I tried and changed the line from the old traceback into: if unicode(self.nextfile, 'iso8859-1') == _('No destination file selected'): Now when self.nextfile is an existing file \xe4.wav that was clicked on in the file dialog's file list this works, however when I type \xe4.wav into the file dialog's entry field I get: TypeError Exception in Tk callback Function: bound method Snackrecorder.start of snackrecorder.Snackrecorder instance at 0xb774518c (type: type 'instancemethod') Args: () Traceback (innermost last): File /usr/lib/python2.3/site-packages/Pmw/Pmw_1_2/lib/PmwBase.py, line 1747, in __call__ return apply(self.func, args) File /usr/local/share/phonoripper-0.6.2/snackrecorder.py, line 304, in start if unicode(self.nextfile, 'iso8859-1') == _('No destination file selected'): TypeError: decoding Unicode is not supported At least this might explain why A\xe4 worked and \xe4 not as I mentioned in a previous post. Now the problem arises how to determine if self.nextfile is unicode or a byte string? Or maybe even better, make sure that self.nextfile is always a byte string so I can safely convert it to unicode later on. But how to convert unicode user input into byte strings when I don't even know the user's encoding ? I guess this will require some further research. I don't know what the best solution is. Two possibilities (substitute your favorite encoding for latin-1): - decode the gettext string, e.g. if self.nextfile == _('No destination file selected').decode('latin-1'): - set your default encoding to latin-1. (This solution is frowned on by the Python-Unicode cognoscenti and it makes your programs non-portable). Do this by creating a file site-packages/sitecustomize.py containing the lines import sys sys.setdefaultencoding('latin-1') Kent Unfortunately the latter is no option, because I definitely need portability. I guess I should probably use utf-8. Thanks and best regards Michael ## Error: 1 UnicodeDecodeError Exception in Tk callback Function: bound method Snackrecorder.start of snackrecorder.Snackrecorder instance at 0xb77fe24c (type: type 'instancemethod') Args: () Traceback (innermost last): File /usr/lib/python2.3/site-packages/Pmw/Pmw_1_2/lib/PmwBase.py, line 1747, in __call__ return apply(self.func, args) File /usr/local/share/phonoripper/snackrecorder.py, line 305, in start if self.nextfile == _('No destination file selected'): UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 22: ordinal not in range(128) ## ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
[Tutor] UnicodeDecodeError
Hello list, I've encountered an (at least for me) weird error in the project I'm working on (see the traceback below). Unfortunately there are several of my application's modules involved, so I cannot post all of my code here. I hope I can explain in plain words what I'm doing. The line in the traceback that seems to cause the problems: if self.nextfile == _('No destination file selected'): self.nextfile is a variable that contains either the path to a file (the destination file for sound recording) or the gettext string you see above. For some reason I get the error below when self.nextfile contains a special character *and* the gettext string holds the german translation, which contains a special character, too (of course '\xe4' as 23rd character). It looks like there are no problems when I remove the german translation or when there are no special characters in the filename, but as soon as I have special characters on both sides of the equation the error occurs. ## Error: 1 UnicodeDecodeError Exception in Tk callback Function: bound method Snackrecorder.start of snackrecorder.Snackrecorder instance at 0xb77fe24c (type: type 'instancemethod') Args: () Traceback (innermost last): File /usr/lib/python2.3/site-packages/Pmw/Pmw_1_2/lib/PmwBase.py, line 1747, in __call__ return apply(self.func, args) File /usr/local/share/phonoripper/snackrecorder.py, line 305, in start if self.nextfile == _('No destination file selected'): UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 22: ordinal not in range(128) ## I've looked into PmwBase.py, but I couldn't figure out what's going on, so I hope that someone here can give me a hint. Thanks in advance and best regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] help with .get in Tkinter
On Sun, 20 Feb 2005 17:12:54 +0200 Mark Kels [EMAIL PROTECTED] wrote: Hi all. First, here is the code I have a problem with (I got same problem in my project) : from Tkinter import * def go(): e.get() print e main=Tk() e=Entry(main) e.pack() b=Button(main,text='OK',command=go()).pack() main.mainloop() For some reason the function is called before I click the button, and I get .10037088 before I have done a thing. How do I do it right ??? -- Hi Mark, First problem: you need to assign the command for the button without parenthesis: b = Button(main, text='OK', command=go) b.pack() I split the line you used into two lines, because pack() returns None , so you don't have a reference to the button once you created it. Of course you can do it the way you did if you don't need to reference the button anymore, however there's not much use in assigning a new variable to it, just write: Button(main,text='OK',command=go()).pack() Second problem: your go() function does just what you told it to: it prints the window name (or however this is called) of the entry widget. You surely meant something like this: def go(): contents = e.get() print contents or simply: def go(): print e.get() I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tkinter questions
On Tue, 1 Feb 2005 19:08:41 +0200 Mark Kels [EMAIL PROTECTED] wrote: Hi Mark, Hello, I got some Tkinter questions that I need the answer for to complete a little project of mine: 1. How can I make the program to open in a X*Y sized window ? from Tkinter import * root = Tk() root.geometry('600x400+0+0') This makes a window of 600x400 pixels placed in the upper left corner of the screen (+0+0 is the x- and y- offset; both of the window size and the offset may be omitted, so you can use '600x400' or '+0+0' as arguments for geometry() as well). 2. How can I open another window from the first one (without closing it) ? Use instances of Toplevel() to create new windows as children of the root (Tk()) window. 3. How can I add a file browser for my app (like the one you get when you press Save as... in windows apps) ? import tkFileDialog filename = tkFileDialog.asksaveasfilename() if filename: # save the file...; if the user presses the 'Cancel' button, filename should be set to an empty string. 4. How do I configure the font size on the Text widget (its realy huge, and I would like to change it to somthing like 12). text = Text(parent, font=('helvetica', '-12', 'normal'))# negative size - pixel size or: text.configure(font=('helvetica', '12', 'normal'))# positive size - point size You can use any 3-tuple of the form (family, size, weight) as font descriptor; if the requested font is not found, the widget should fall back to some (probably ugly) default; tk guarantees that at least 'times', 'helvetica' and 'courier' font families are available, the availability of other fonts depends on your system. I hope this helps Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Tix and Table printing
On Fri, 14 Jan 2005 08:47:49 - Alan Gauld [EMAIL PROTECTED] wrote: Tk was written in the 80's so given its origins was not likely to have a table. Of course it would be nice if they added one now!!! It looks like they are already working on it: http://wiki.tcl.tk/12753 Regards Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] O.T.
* Jacob S. [EMAIL PROTECTED] [041228 01:42]: But who are you all, what are you're ages, what do you do, marriage status, etc? 37, no kids but a girlfriend with a cat. I work at a clinical laboratory in a hospital in germany. I'm just a hobby programmer and started with python about 2 years ago; I chose python as my first (and yet only) language because I happened to find a cheap german version of Ivan van Laningham's Teach yourself python in 24 hours in a local bookstore when I was looking for something to start with. The book had a sticker on it that said something like No programming knowledge required! which looked very promising to me back then. A happy new year to all of you Michael ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor