Portál AbcLinuxu, 14. července 2025 06:19


Dotaz: Python3 + TkInter: jak ulozit data z formulare?

27.2.2017 21:15 zdenek2008 | skóre: 26
Python3 + TkInter: jak ulozit data z formulare?
Přečteno: 321×
Odpovědět | Admin
Chtel bych si upravovat data v promenne (slovniku) prostrednictvim GUI formulare. Ten formular by se mel generovat podle toho slovniku, takze pocet vstupnich poli by odpovidal poctu polozek ve slovniku, takze zmena poctu polozek slovniku by se automaticky promitla ve zmene gui formulare. To funguje celkem bez problemu, graficky vzhled zatim take neresim. Co mi ale nejde, je jak pozmenene udaje ve formulari ulozit. Idealni by bylo kliknutim na tlacitko "Save" zmenit tu promennou, ale zatim to meni vzdy jen posledni vstupni pole, protoze cyklus for generuje pouze radu totoznych identifikatoru "entry". Nemeli byste nejake tipy jak to doresit?
CLAIMANT_PYTHON_OBJECT={
    'CLAIMANT_TITLE':'pan',
    'CLAIMANT_FIRST_NAME':'ferda',
    'CLAIMANT_SURNAME':'mravenec',
    'CLAIMANT_PLURAL':'', #s
    'CLAIMANT_PLURAL_CAPITALISED':'', #S
    'CLAIMANT_ADDRESS':'mraveniste pod smrkem',
    'CLAIMANT_POSTCODE_1111':'355',
    'CLAIMANT_POSTCODE_222':'09',
    'CLAIMANT_TELEPHONE_NUMBER':'158158158',
    'CLAIMANT_FAX_NUMBER':'',
    'CLAIMANT_EMAIL':'f.mravenec@mraveniste.cz',
    'CLAIMANT_REF':'',
    }

print('dictionary:', CLAIMANT_PYTHON_OBJECT)

window=Tk()
window.title('The Claimant')
frame=Frame(window)

def show_entry_field():
   print(entry.get())

for key, value in CLAIMANT_PYTHON_OBJECT.items():
    label=Label(frame, text=key)
    label.pack()
    entry=Entry(frame)
    entry.insert(0, value)
    entry.pack()

button=Button(frame, text='Save', command=show_entry_field)
button.pack()

frame.pack(padx=10, pady=10)
window.mainloop()

print('dictionary amended:', CLAIMANT_PYTHON_OBJECT)

Za pripadne napady predem diky.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (zdenek2008 (tazatel))
27.2.2017 22:32 .
Rozbalit Rozbalit vše Re: Python3 + TkInter: jak ulozit data z formulare?
Odpovědět | | Sbalit | Link | Blokovat | Admin
No, někde si je všechny podrž. S minimálními změnami (není to pěkný ani dobrý) třeba takhle:
CLAIMANT_PYTHON_OBJECT={
	'CLAIMANT_TITLE':'pan',
	'CLAIMANT_FIRST_NAME':'ferda',
	'CLAIMANT_SURNAME':'mravenec',
	'CLAIMANT_PLURAL':'', #s
	'CLAIMANT_PLURAL_CAPITALISED':'', #S
	'CLAIMANT_ADDRESS':'mraveniste pod smrkem',
	'CLAIMANT_POSTCODE_1111':'355',
	'CLAIMANT_POSTCODE_222':'09',
	'CLAIMANT_TELEPHONE_NUMBER':'158158158',
	'CLAIMANT_FAX_NUMBER':'',
	'CLAIMANT_EMAIL':'f.mravenec@mraveniste.cz',
	'CLAIMANT_REF':'',
	}

print('dictionary:', CLAIMANT_PYTHON_OBJECT)

# <------
class DictFrame(Frame):
	def __init__(self, dictionary, *args, **kwargs):
		super(DictFrame, self).__init__(*args, **kwargs)
		self.dictionary = dictionary
		self.entries = []

	def append(self, entry):
		self.entries.append(entry)

	def save(self):
		for entry in self.entries:
			print(entry.key, '=', entry.var.get())
			self.dictionary[entry.key] = entry.var.get()

# <------
class KeyEntry(Entry):
	def __init__(self, key, *args, **kwargs):
		self.key = key
		self.var = StringVar()
		kwargs['textvariable'] = self.var
		super(KeyEntry, self).__init__(*args, **kwargs)

window=Tk()
window.title('The Claimant')
frame=DictFrame(CLAIMANT_PYTHON_OBJECT, window) # <------

for key, value in CLAIMANT_PYTHON_OBJECT.items():
	label=Label(frame, text=key)
	label.pack()
	entry=KeyEntry(key, frame) # <------
	entry.insert(0, value)
	entry.pack()
	frame.append(entry) # <------

button=Button(frame, text='Save', command=frame.save) # <------
button.pack()

frame.pack(padx=10, pady=10)
window.mainloop()

print('dictionary amended:', CLAIMANT_PYTHON_OBJECT)
28.2.2017 21:09 zdenek2008 | skóre: 26
Rozbalit Rozbalit vše Re: Python3 + TkInter: jak ulozit data z formulare?
Diky, to funguje na 100%.
27.2.2017 22:39 NN
Rozbalit Rozbalit vše Re: Python3 + TkInter: jak ulozit data z formulare?
Odpovědět | | Sbalit | Link | Blokovat | Admin
entries = []

for key, value in CLAIMANT_PYTHON_OBJECT.items():
   ...
   entries.append((key, entry))

for ent in entries:
   print ent[1].get()
28.2.2017 21:06 zdenek2008 | skóre: 26
Rozbalit Rozbalit vše Re: Python3 + TkInter: jak ulozit data z formulare?
Takhle?
import logging
from decimal import *
import os
import glob
import pickle
from tkinter import *
import tkinter.messagebox as box

CLAIMANT_PYTHON_OBJECT={
    'CLAIMANT_TITLE':'pan',
    'CLAIMANT_FIRST_NAME':'ferda',
    'CLAIMANT_SURNAME':'mravenec',
    'CLAIMANT_PLURAL':'', #s
    'CLAIMANT_PLURAL_CAPITALISED':'', #S
    'CLAIMANT_ADDRESS':'mraveniste pod smrkem',
    'CLAIMANT_POSTCODE_1111':'355',
    'CLAIMANT_POSTCODE_222':'09',
    'CLAIMANT_TELEPHONE_NUMBER':'158158158',
    'CLAIMANT_FAX_NUMBER':'',
    'CLAIMANT_EMAIL':'f.mravenec@mraveniste.cz',
    'CLAIMANT_REF':'',
    }

print('dictionary:', CLAIMANT_PYTHON_OBJECT)

window=Tk()
window.title('The Claimant')
frame=Frame(window)

def show_entry_field():
   print(entry.get())

entries = []

for key, value in CLAIMANT_PYTHON_OBJECT.items():
    label=Label(frame, text=key)
    label.pack()
    entry=Entry(frame)
    entry.insert(0, value)
    entry.pack()
    entries.append((key, entry))

button=Button(frame, text='Save', command=show_entry_field)
button.pack()

frame.pack(padx=10, pady=10)
window.mainloop()

for ent in entries:
   print (ent[1].get())

print('dictionary amended:', CLAIMANT_PYTHON_OBJECT)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.