473,385 Members | 1,333 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

I need a little help with Tkinter Entry widget

I'm trying to make a custom entry widget, as in the code that follows.
There are two problems I'm trying to fix:

1) I would like the widget to behave as myEntry.Escape() does now,
except that it happens on loss of focus, not when pressing Esc.

2) TABbing between multiple entry fields does undesired things with
the selection, and with cursor placement.

Can anyone offer any suggestions for how to fix this? I'm attemting to
replicate, more or less, the behavior one would get with, for example,
MS Excel, in navigating and entering data in an array of entry fields.

Also, I'd appreciate any critique of my overall technique,
particularly in how I've implemented the "undo" behavior - it works,
but doesn't seem particularly clean.

Thanks!

------------------------------------------------------

from Tkinter import *

class history:
"""this is a mixin for my custom widgets,
providing for "infinite" undo."""
LOG = []
COUNT = {}
def log(self):
history.LOG.append((self, self.value))
history.COUNT.setdefault(id(self), 0)
history.COUNT[id(self)] += 1
def undo(self):
try:
s, v = history.LOG.pop()
if history.COUNT[id(s)]:
s.value = v
history.COUNT[id(s)] -= 1
if not history.COUNT[id(s)]:
del history.COUNT[id(s)]
s.Show()
except IndexError:
pass

class myEntry(Entry, history):
"""
This works pretty well, with one exception: I would like the
widget to behave as Escape() does now, except that it happens
on loss of focus, not when pressing Esc.

Also, TABbing between entry fields causes the text in the next
widget to be selected, with the cursor at the end of the text.
When keys are pressed, the text is appended to the selected
text, rather than replacing the selection as would be expected.
"""
def __init__(self, master=None, state=NORMAL, **config):
Entry.__init__(self, master, **config)
if master == None:
self.pack()
self.insert(INSERT, str(self))
self.bind('<Return>', self.Return)
self.bind('<Escape>', self.Escape)
self.bind('<Key>', self.Key)
self.bind('<Control-z>', self.ctrl_z)
self.mode = 'display'
if state == DISABLED:
self.config(state=DISABLED)
def Show(self):
self.delete(0, END)
self.insert(INSERT, str(self))
self.mode = 'display'
try:
history.COUNT[id(self)] # fails if no history
(changes)
self.config(bg='pink', fg='black')
except:
self.config(bg='white', fg='black')
def Key(self, event):
try:
x = ord(event.char) # fails if not an ASCII key
if event.keysym == 'Tab':
self.Return(None)
elif self.mode == 'display':
self.config(bg='red', fg='white')
self.mode = 'entry'
E, I = self.index(END), self.index(INSERT)
self.delete(0, END)
self.insert(INSERT, self.STR())
i = self.index(END)
self.icursor(i - (E - I))
except:
pass
def Return(self, event):
if self.focus_get():
self.Validate(self.get())
self.Show()
def Escape(self, event):
self.Show()
def ctrl_z(self, event):
self.undo()
def Validate(self, value):
pass

class gui_int(myEntry):
def __init__(self, value=0, master=None, **config):
self.value = 0
myEntry.__init__(self, master, **config)
def Validate(self, value):
try:
v = int(value)
if v != self.value:
self.log()
self.value = v
except:
pass
def __str__(self):
return 'INT: ' + str(self.value)
def STR(self):
return str(self.value)

x=gui_int(value=22.34, font='Courier 12', state=DISABLED, width=11,
justify=RIGHT)
y=gui_int(font='Courier 12', width=11, justify=RIGHT)
z=gui_int(value=10.99, font='Courier 12', width=11, justify=RIGHT)
Jul 18 '05 #1
3 4908

"Phil Schmidt" <ph*****************@yahoo.com> schrieb im Newsbeitrag
news:22**************************@posting.google.c om...
I'm trying to make a custom entry widget, as in the code that follows.
There are two problems I'm trying to fix:

1) I would like the widget to behave as myEntry.Escape() does now,
except that it happens on loss of focus, not when pressing Esc.

Then why don't you bind <FocusOut> and <FocusIn> ?

Kindly
Michael P
Jul 18 '05 #2
Oh! Seems obvious when you say it! I've been using the Fredrik Lundh
documentation, and saw nothing about those. Perhaps I should follow
the recommendations of other posters and get that book about
Tkinter...

Thanks,
Phil
Jul 18 '05 #3

"Phil Schmidt" <ph*****************@yahoo.com> schrieb im Newsbeitrag
news:22**************************@posting.google.c om...
Oh! Seems obvious when you say it! I've been using the Fredrik Lundh
documentation, and saw nothing about those. Perhaps I should follow
the recommendations of other posters and get that book about
Tkinter...


Have alook at New Mexico Tech
http://www.nmt.edu/tcc/help/pubs/lang.html
There are two very concise as well as comprehensive documents.

Kndly
Michael P

a.. Python 2.2 programming language quick reference, 46 pp. [HTML]
[PostScript] [PDF]
b.. Tkinter reference: a GUI for Python, 84 pp. [PostScript] [PDF]

Jul 18 '05 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

0
by: Mickel Grönroos | last post by:
Hi, I'm trying to put an Tkinter.Entry of fixed size onto a specific location on a canvas using the place manager. The idea is that one can double-click a rectangle object on a canvas to get an...
3
by: bigbinc | last post by:
I have used the 'entry' tk widget to get text values, I am now using 'Text' but I cant seem to use 'get' method. The TK docs say use get(index1, index2), I tried numbers and get an error ...
3
by: Matt Hammond | last post by:
Here's a strange one in Tkinter that has me stumped: (I'm running python 2.4 on Suse Linux 9.3 64bit) I'm trying to make a set of Entry widgets with Label widgets to the left of each one, using...
2
by: Dustan | last post by:
How do I limit what the user can enter in an Entry Widget? I know I can set it to display '*' to hide a password, but what I want to do is limit the contents to numeric characters. What is the...
5
by: vagrantbrad | last post by:
I've created a short test program that uses tkFileDialog.askdirectory to help the user input a path into a tk entry widget. The problem I'm having is that when I run the code as listed below, the...
4
by: BartlebyScrivener | last post by:
Using Python on Debian Etch. What is the best way to paste a block of text in at the command prompt. I'm trying something like: Quote = raw_input("Paste quote here: ") Which works great...
3
Elias Alhanatis
by: Elias Alhanatis | last post by:
Hello to everybody!! I am running Python 2.5.1 on Windows Vista and i have a problem with the "Entry" widget of Tkinter. Take a look at this code: from Tkinter import * def fetch(): ...
8
by: Lie | last post by:
Inspect the following code: --- start of code --- import Tkinter as Tk from Tkconstants import * root = Tk.Tk() e1 = Tk.Entry(root, text = 'Hello World') e2 = Tk.Entry(root, text = 'Hello...
0
by: Leonhard Vogt | last post by:
Hello I have the following problem in Python 2.5 on Windows XP. On Ubuntu I do not see the problem. I have a Tkinter application as in the following example The entry-widget is somehow...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.