Press button to load data


G

gilbert3b2g

I'm new to Python, and programming in general.
What I'm trying to do here is to load a list of accounts from a file on
my harddrive into a string of Buttons in Tkinter, and when I press one
of the Buttons, which has one of my account name, it will load that
account into a new window. But I don't understand how to code the
proccess that would tell the program what account is selected. Any help
with this would be very appreciated. Thanks in advance.

from Tkinter import *
import shelve
from tkMessageBox import showerror

shelvename = shelve.open('class-shelve2')
cat = (' Name ', ' Account # ', ' Amount Due ', ' Date Due ')

def NameFields(top):
name1 = Label(None, text=cat[0], relief=RIDGE, width=20, fg='blue',
bg='white', font=('bold',15))
name2 = Label(None, text=cat[1], relief=RIDGE, width=15, fg='blue',
bg='white', font=('bold',15))
name3 = Label(None, text=cat[2], relief=RIDGE, width=15, fg='blue',
bg='white', font=('bold',15))
name4 = Label(None, text=cat[3], relief=RIDGE, width=15, fg='blue',
bg='white', font=('bold',15))
name1.grid(row=0, column=0, sticky=NSEW)
name2.grid(row=0, column=1, sticky=NSEW)
name3.grid(row=0, column=2, sticky=NSEW)
name4.grid(row=0, column=3, sticky=NSEW)
top.columnconfigure(0, weight=1)
top.columnconfigure(1, weight=1)
top.columnconfigure(2, weight=1)
top.columnconfigure(3, weight=1)


def DisplayBills(top):
c=0
for bill in shelvename:
bill1 = Button(None, text= shelvename[bill].name,
font=('bold',10), command=fetchRecord)
bill2 = Label(None, text= shelvename[bill].account,
relief=RIDGE, font=('bold',10))
bill3 = Label(None, text= shelvename[bill].paymentDue,
relief=RIDGE, font=('bold',10), fg='red')
bill4 = Label(None, text= shelvename[bill].dateDue,
relief=RIDGE, font=('bold',10))
bill1.grid(row=c, column=0, sticky=NSEW)
bill2.grid(row=c,column=1, sticky=NSEW)
bill3.grid(row=c,column=2, sticky=NSEW)
bill4.grid(row=c,column=3, sticky=NSEW)
c = c + 1

def fetchRecord():

top = Tk()

DisplayBills(top), NameFields(top)

mainloop()
 
Ad

Advertisements

D

Dennis Lee Bieber

bill1 = Button(None, text= shelvename[bill].name,
font=('bold',10), command=fetchRecord)

You'll either need to have a fetchRecordxx (one for each button), or
you need to pass an identifier parameter. Unfortunately you can't use

command = fetchRecord(id)

as that will CALL fetchRecord and make the command whatever the function
returns.

I think the common means to handle this is via a lambda expression,
something like

command = (lambda x = id: fetchRecord(x))

--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 
J

jim-on-linux

Just from a glance my thoughts are to
start with one file and build on it. Make
a class of it so you can loop it to use
it over for each record.


You wrote that the info was in a file on
the hd. If it is in a file on the hd, use the
open()
function, read from the file, only one record
and write the data to a list.

You can incorporate the
button option,

"command = CallSomeFunction",

to call a function that builds a window,
and loads the data into labels or
entry boxes.
If you are going to modify
the data, entry boxes allow you to
modify it and save it back to a
file.

Also, when using the open() function,
close it after you get the data you need.
otherwise you may experience
unexpected problems.

client = open('client', 'r')
client.read() (readline()) (readlines())
client.close()

jim-on-linux

http//:www.inqvista.com





On Wednesday 15 November 2006 23:20,
I'm new to Python, and programming in general.
What I'm trying to do here is to load a list of
accounts from a file on my harddrive into a
string of Buttons in Tkinter, and when I press
one of the Buttons, which has one of my account
name, it will load that account into a new
window. But I don't understand how to code the
proccess that would tell the program what
account is selected. Any help with this would
be very appreciated. Thanks in advance.

from Tkinter import *
import shelve
from tkMessageBox import showerror

shelvename = shelve.open('class-shelve2')
cat = (' Name ', ' Account # ', ' Amount Due ',
' Date Due ')

def NameFields(top):
name1 = Label(None, text=cat[0],
relief=RIDGE, width=20, fg='blue', bg='white',
font=('bold',15))
name2 = Label(None, text=cat[1],
relief=RIDGE, width=15, fg='blue', bg='white',
font=('bold',15))
name3 = Label(None, text=cat[2],
relief=RIDGE, width=15, fg='blue', bg='white',
font=('bold',15))
name4 = Label(None, text=cat[3],
relief=RIDGE, width=15, fg='blue', bg='white',
font=('bold',15))
name1.grid(row=0, column=0, sticky=NSEW)
name2.grid(row=0, column=1, sticky=NSEW)
name3.grid(row=0, column=2, sticky=NSEW)
name4.grid(row=0, column=3, sticky=NSEW)
top.columnconfigure(0, weight=1)
top.columnconfigure(1, weight=1)
top.columnconfigure(2, weight=1)
top.columnconfigure(3, weight=1)


def DisplayBills(top):
c=0
for bill in shelvename:
bill1 = Button(None, text=
shelvename[bill].name, font=('bold',10),
command=fetchRecord) bill2 = Label(None, text=
shelvename[bill].account, relief=RIDGE,
font=('bold',10))
bill3 = Label(None, text=
shelvename[bill].paymentDue, relief=RIDGE,
font=('bold',10), fg='red') bill4 = Label(None,
text= shelvename[bill].dateDue, relief=RIDGE,
font=('bold',10))
bill1.grid(row=c, column=0,
sticky=NSEW) bill2.grid(row=c,column=1,
sticky=NSEW) bill3.grid(row=c,column=2,
sticky=NSEW) bill4.grid(row=c,column=3,
sticky=NSEW) c = c + 1

def fetchRecord():

top = Tk()

DisplayBills(top), NameFields(top)

mainloop()
 
J

jim-on-linux

Without being able to run the code my question is
where is the id in the lambda defined?


Thanks for your help, but now I have a another
problem so here is my code again
when I run this it prints <built-in function
id>

from Tkinter import *
import shelve
from tkMessageBox import showerror

shelvename = shelve.open('class-shelve2')
cat = (' Name ', ' Account # ', ' Amount Due ',
' Date Due ')

def NameFields(top):
name1 = Label(None, text=cat[0],
relief=RIDGE, width=20, fg='blue', bg='white',
font=('bold',15))
name2 = Label(None, text=cat[1],
relief=RIDGE, width=15, fg='blue', bg='white',
font=('bold',15))
name3 = Label(None, text=cat[2],
relief=RIDGE, width=15, fg='blue', bg='white',
font=('bold',15))
name4 = Label(None, text=cat[3],
relief=RIDGE, width=15, fg='blue', bg='white',
font=('bold',15))
name1.grid(row=0, column=0, sticky=NSEW)
name2.grid(row=0, column=1, sticky=NSEW)
name3.grid(row=0, column=2, sticky=NSEW)
name4.grid(row=0, column=3, sticky=NSEW)
top.columnconfigure(0, weight=1)
top.columnconfigure(1, weight=1)
top.columnconfigure(2, weight=1)
top.columnconfigure(3, weight=1)


def DisplayBills(top):
c=0
x = []
global bill
for bill in shelvename:
global funcs
bill1 = Button(None, text=
shelvename[bill].name,
font=('bold',10),command=(lambda x = id:
fetchRecord(x)))

bill2 = Label(None, text=
shelvename[bill].account, relief=RIDGE,
font=('bold',10))
bill3 = Label(None, text=
shelvename[bill].paymentDue, relief=RIDGE,
font=('bold',10), fg='red') bill4 = Label(None,
text= shelvename[bill].dateDue, relief=RIDGE,
font=('bold',10))
bill1.grid(row=c, column=0,
sticky=NSEW) bill2.grid(row=c,column=1,
sticky=NSEW) bill3.grid(row=c,column=2,
sticky=NSEW) bill4.grid(row=c,column=3,
sticky=NSEW) c = c + 1
return bill

def fetchRecord(x):
print x



top = Tk()

DisplayBills(top), NameFields(top)

mainloop()

jim-on-linux said:
Just from a glance my thoughts are to
start with one file and build on it. Make
a class of it so you can loop it to use
it over for each record.


You wrote that the info was in a file on
the hd. If it is in a file on the hd, use the
open()
function, read from the file, only one record
and write the data to a list.

You can incorporate the
button option,

"command = CallSomeFunction",

to call a function that builds a window,
and loads the data into labels or
entry boxes.
If you are going to modify
the data, entry boxes allow you to
modify it and save it back to a
file.

Also, when using the open() function,
close it after you get the data you need.
otherwise you may experience
unexpected problems.

client = open('client', 'r')
client.read() (readline()) (readlines())
client.close()

jim-on-linux

http//:www.inqvista.com
 
D

Dennis Lee Bieber

Without being able to run the code my question is
where is the id in the lambda defined?
Please take into account that I've not actually used lambdas, so
might have some mistakes in the syntax...
for bill in shelvename:
global funcs
bill1 = Button(None, text=
shelvename[bill].name,
font=('bold',10),command=(lambda x = id:
fetchRecord(x)))

"id" would be something that "identifies" the button... In this
case, maybe you can use "bill":

... command=(lambda x = bill: fetchRecord(x)) ...

As I understand the lambda syntax, what this does is create a "function"
(which is the command that gets run when the button is pushed), and this
function will call fetchRecord passing it the value that "x" had at the
time of definition (hence the x=...)
--
Wulfraed Dennis Lee Bieber KD6MOG
(e-mail address removed) (e-mail address removed)
HTTP://wlfraed.home.netcom.com/
(Bestiaria Support Staff: (e-mail address removed))
HTTP://www.bestiaria.com/
 
Ad

Advertisements

J

jim-on-linux

Without being able to run the code my
question is where is the id in the lambda
defined?

Please take into account that I've not
actually used lambdas, so might have some
mistakes in the syntax...
for bill in shelvename:
global funcs
bill1 = Button(None, text=
shelvename[bill].name,
font=('bold',10),command=(lambda x = id:
fetchRecord(x)))

"id" would be something that "identifies" the
button... In this case, maybe you can use
"bill":

Think about relating a Tkinter variable to each
button then the button is related to a unique
variable. ( Tkinter StingVar or IntVar or some
others.) Then you will have to keep the variables
in a list or dictionary for recalling.


jim-on-linux
http://www.inqvista.com
 
Ad

Advertisements


Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top