-----Original Message----- From: tutor-request <tutor-requ...@python.org> To: tutor <tutor@python.org> Sent: Fri, Dec 10, 2010 6:33 pm Subject: Tutor Digest, Vol 82, Issue 45 Send Tutor mailing list submissions to tutor@python.org To subscribe or unsubscribe via the World Wide Web, visit http://mail.python.org/mailman/listinfo/tutor r, via email, send a message with subject or body 'help' to tutor-requ...@python.org You can reach the person managing the list at tutor-ow...@python.org When replying, please edit your Subject line so it is more specific han "Re: Contents of Tutor digest..." oday's Topics: 1. Re: role playing game - help needed (ALAN GAULD) 2. Re: Writing to the terminal? (Alan Gauld) 3. Re: Globals as variables in a tkinter widget (Alan Gauld) 4. Re: the "**" operator? (Alex Hall) 5. Code evaluation inside of string fails with __get_item (Tim Johnson) --------------------------------------------------------------------- Message: 1 ate: Fri, 10 Dec 2010 23:21:22 +0000 (GMT) rom: ALAN GAULD <alan.ga...@btinternet.com> o: Al Stern <albst...@gmail.com> c: "tutor@python.org" <tutor@python.org> ubject: Re: [Tutor] role playing game - help needed essage-ID: <448643.14907...@web86708.mail.ird.yahoo.com> ontent-Type: text/plain; charset="utf-8" Thanks again Alan. Much clearer now. One final part I don't understand. >>> "%d is the result of %d + %d" % (6+7,6,7) I understand (I think) the 6+7 part but why the ,6,7 after that. I could see how either '6+7' or '6,7' would be the correct format but not both. The format string has 3 percent markers - all numbers. t is therefore expecting 3 values, so I have to give it them. he first marker gets 6+7, ie 13. The second gets 6 he third 7... Look at the first example in the loops topic in my tutorial. t uses variables in the same way rather than literal values, hat might make it more obvious. Maybe :-) HTH, Alan G. ------------- next part -------------- n HTML attachment was scrubbed... RL: <http://mail.python.org/pipermail/tutor/attachments/20101210/a7647551/attachment-0001.html> ------------------------------ Message: 2 ate: Fri, 10 Dec 2010 23:42:56 -0000 rom: "Alan Gauld" <alan.ga...@btinternet.com> o: tutor@python.org ubject: Re: [Tutor] Writing to the terminal? essage-ID: <idudu0$n0...@dough.gmane.org> ontent-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original Modulok" <modu...@gmail.com> wrote > Assume I'm working in a command shell on a terminal. Something like tcsh on xterm, for example. I have a program which does *something*. Let's say it counts down from 10. How do I print a value, and then erase that value, replacing it with another value? This is one of those things that sounds like it should be easy but is n act deceptively difficult to get right! It all depends on your terminal, and there are dozens of different erminal ypes and settings. Thats why Unix has a terminfo (or in some Unices ermcap - even they can't agree! :-) library to define the different erminal ypes and try to bring some sanity to proceedings.But you need to earn the basic terminal control codes. In this case you need the backspace code which is Ctrl-H or chr(8). Try this >>> print "spam" + "chr(8)*2+"ear" If your terminal recognises chr(8) as backspace you should ee "spear". If it doesn't you'll see someting like: spam^h^hear The only foolproof way to do this kind of thing is to use a library ike urses which allows you to positioon the cursor and overwrite whatever as there. But curses is non-trivial to use - not ridiculously hard, ut on trivial. You can get a basic intro to curses in the event-driven topic f my tutorial. BTW there is quite a good writeup on terminfo here: ttp://tldp.org/HOWTO/Text-Terminal-HOWTO-16.html nd, as usual, Wikipedia has a fair writeup. -- lan Gauld uthor of the Learn to Program web site ttp://www.alan-g.me.uk/ ----------------------------- Message: 3 ate: Sat, 11 Dec 2010 00:06:19 -0000 rom: "Alan Gauld" <alan.ga...@btinternet.com> o: tutor@python.org ubject: Re: [Tutor] Globals as variables in a tkinter widget essage-ID: <iduf9s$rt...@dough.gmane.org> ontent-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=original echo...@aol.com> wrote > This code produces a good run. Not sure what you mean by that. What is "a good run"? > from tkinter import * root = Tk() class Application(Frame): global sv, Ptype, PtypeI, sel_rate_label, label This is bizarre. lobals are generally considered evil and to be avoided if possible. ne way to avoid globals is to use classes. o why on earth are you trying to introduce globals ionto a class? hat do you think you will achieve that using class variables can't? > label = Label(root) Ptype = 999 PtypeI = IntVar() W = 5 Y = 4 And in fact most of these should probably be instance ariables defined within your init() method... def sel(self): global W global Y Ptype = PtypeI.get() if Ptype <= 333: print('\nResulting Values:', typeI.get(),Ptype) else: print('Ptype Failure:',PtypeI.get()) print('Ptype Completed',Ptype,'\n') V = 2 X = 3 Z = X * 2 W = X + 6 Y = V ** 2 U = W * Y print("V: ",V," X: ",X," Z: ",Z," W: ",W," Y: ",Y," U: ,U,'\n') return Mixing print statements and GUIS is valid for debugging, ut these don't look like debnug statements... Are you sure ou want these appearing in the console rather than the GUI? def __init__(self,master=None): Frame.__init__(self) You might want to pass the master in to Frame too... self.pack() sel_rate_label = Label(self) sel_rate_label.config(text = '\nSelect Goats Personality ype',) sel_rate_label.pack(anchor=N) MODES = [ ("1 Below Average", 000), ("2 Average", 111), ("3 Above Average", 222), ("4 Super Star", 333), ] for text, mode in MODES: b = Radiobutton(self, text=text, variable=PtypeI, value=mode, command = elf.sel) b.pack(anchor=W) label.pack() Why use the global label here when you use the instance evel labels elsewhere? Especially as you don't appear to use it? > Resulting Values: 333 333 Ptype Completed 333 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python31\lib\tkinter\__init__.py", line 1399, in __call__ return self.func(*args) File "C:\Larry\FCGCF\GPDB\Dev\EX_OK.py", line 18, in sel U = W * Y TypeError: can't multiply sequence by non-int of type 'str' It seems to think that Y is a string. our code suggests Y is V**2 or 4. an you insertt a print statement just before the offending ine to find out what W and Y are at that exact point? > My goal is to I learnto use a global variable as an argument inside a widget function, Why do you think that will be useful? hat do you think you can do with globals that you can't do with lass or instance variables? > My Question is: Anybody know of some good on-line documentation about using GUIs to do more than say 'Hello World'? There are a lot of GUI tutorials, some even use Tkinter. ven my tutorial includes the GUI in the case study and the event riven rogramming topics as well as the GUI topic itself. They don;t go far eyond hello world but they do take at least one step further. HTH, -- lan Gauld uthor of the Learn to Program web site ttp://www.alan-g.me.uk/ hanks for the speedy and thorough response. I'm brand new to Python and was trying old, lazy C+ tricks, I guess. Am going to take your advice, try to do it right and see what happens. 'preciate the code examples and the link, checked it out & like its style, anyway. Thanks again, Larry ----------------------------- Message: 4 ate: Fri, 10 Dec 2010 19:26:52 -0500 rom: Alex Hall <mehg...@gmail.com> o: Hugo Arts <hugo.yo...@gmail.com> c: tutor@python.org ubject: Re: [Tutor] the "**" operator? essage-ID: <aanlktinsxhkml+ycavkwbhz8dopayqb9gq57jqluo...@mail.gmail.com> ontent-Type: text/plain; charset=ISO-8859-1 Thanks all! I thought update() would add an item even if it would be a uplicate, but apparently not. I also now better understand why I am lways passing around *args and **kwargs when calling super(). Very nteresting... On 12/10/10, Hugo Arts <hugo.yo...@gmail.com> wrote: On Fri, Dec 10, 2010 at 8:14 PM, Alex Hall <mehg...@gmail.com> wrote: > Hi all, > I was googling a way to do something like > mydict=mydict.extend(additionaldict) > mydict.update(additionaldict) see also: http://docs.python.org/library/stdtypes.html#dict.update > and someone on a forum recommends this: > mydict=dict(mydict, **additionaldict) > What is the ** doing here? I tried to look it up, but Google seems to > ignore it since it is punctuation. The poster on the forum says it > will put all elements of additionaldict in mydict that are not already > in mydict, which is the behavior I am looking for, but I am not sure > why this would be so. TIA. > The * and **, when calling functions, are what's called extended calling syntax. It's a bit hard to explain, so I'm going to do a sort of clarify by example here: >>> def f(a, b, c): ... print a, b, c ... >>> f(1, 2, 3) 1 2 3 >>> a = [1, 2, 3] >>> f(*a) 1 2 3 >>> b = {'a': 2, 'b': 1, 'c': 3} >>> f(*b) a c b >>> f(**b) 2 1 3 In short, if a = [1, 2, 3], f(*a) is the same as f(1, 2, 3). if b = {'a': 2, 'b': 1, 'c': 3}, then f(**b) is the same as f(a=2, b=1, c=3). The * will iterate over its argument, and supply the resulting values as arguments to the function (iterating over a dict will return its keys, which is what you see with f(*b) here). ** requires a mapping type, and supplies the keys and values to the function as keyword arguments. * and ** are very flexible, and you can use them alongside with regular arguments: >>> f(1, *[2, 3]) 1 2 3 >>> f(1, **{'b': 2, 'c': 3}) 1 2 3 * and ** also have uses in function definition, where they sort of do the reverse. They can capture any number of regular or keyword arguments in a tuple or dictionary: >>> def f(*args, **kwargs): ... print args, kwargs ... >>> f() () {} >>> f(1, 2, 3) (1, 2, 3) {} >>> f(1, 2, 3, a=4, b=5) (1, 2, 3) {'a': 4, 'b': 5} >>> f(a=4, b=5) () {'a': 4, 'b': 5} Like with function calls, you can mix up regular arguments and */** arguments, as long as the resulting function is unambiguous: >>> def f(a, *args, **kwargs): ... print a, args, kwargs ... >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() takes at least 1 argument (0 given) >>> f(1) 1 () {} >>> f(1, 2, 3) 1 (2, 3) {} >>> f(1, 2, 3, b=4, c=5) 1 (2, 3) {'c': 5, 'b': 4} - ave a great day, lex (msg sent from GMail website) ehg...@gmail.com; http://www.facebook.com/mehgcap ----------------------------- Message: 5 ate: Fri, 10 Dec 2010 15:24:52 -0900 rom: Tim Johnson <t...@johnsons-web.com> o: tutor@python.org ubject: [Tutor] Code evaluation inside of string fails with __get_item essage-ID: <20101211002452.gb3...@johnsons-web.com> ontent-Type: text/plain; charset=us-ascii I'm using Python 2.6.5. he following problem is coming from inside of a complex code base nd involves an implementation that I have used for years, and is ow failing to execute in certain conditions. his problem occurs with either of the follow two classes, which are lifted' from 'Python Cookbook'. Class code follows: lass Eval: def __init__(self, globals=None, locals=None): self.globals = globals or {} self.locals = locals or None def __getitem__(self, key): if self.locals is None: self.locals = sys._getframe(1).f_locals key = key % self return eval(key, self.globals, self.locals) # and this one: lass Evalx: def __init__(self, localvals = None, globalvals = None): if localvals is None : self.locals = sys._getframe(1).f_locals else : self.locals = locals if globalvals is None : self.globals = sys._getframe(1).f_globals else : self.globals = globals def __getitem__(self,key): return eval(key,self.globals,self.locals) # either are used the same way: To evaluate code inside of a string # A larger description can be found at: # http://code.activestate.com/recipes/66018-evaluating-code-inside-strings/ he execution looks like this: elf.content = formatted_string % Evalx() # where 'self' refers to an object of another class, that uses the # Eval class nder certain circumstances, the embedded is code *not* executed. y inserting debugging stubs, I can see that the the Eval/Evalx instantiation oes occur, but the overloaded function call to __get_item does not* occur. I have also found that a seemingly unrelated event having o do with file I/O must be causing a side effect. However, to keep hings simple, I am first asking the following question: hat would cause __get_item__ not to be called? I can confirm by ther testing that the embedded codde is properly composed with atching keywords. This is probably the most difficult to resolve problem I've ever run nto in python. My lack of understand of the underlying code in the val classes is probably a contributing factor. TIA - im im at johnsons-web.com or akwebsoft.com ttp://www.akwebsoft.com ----------------------------- _______________________________________________ utor maillist - Tutor@python.org ttp://mail.python.org/mailman/listinfo/tutor nd of Tutor Digest, Vol 82, Issue 45 ************************************
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor