+: tkinter 133-138
24
README.md
@ -4,7 +4,7 @@ Guia interactiva con la resolución de los retos propuestos en el libro
|
|||||||
[Python by Example](https://www.google.cl/books/edition/Python_by_Example/gDGdDwAAQBAJ)
|
[Python by Example](https://www.google.cl/books/edition/Python_by_Example/gDGdDwAAQBAJ)
|
||||||
de *Nichola Lacey*
|
de *Nichola Lacey*
|
||||||
|
|
||||||
## Retos básicos
|
### Retos Básicos
|
||||||
|
|
||||||
- [001-011](./basic/basic01.py)
|
- [001-011](./basic/basic01.py)
|
||||||
- [012-019](./basic/basic02.py)
|
- [012-019](./basic/basic02.py)
|
||||||
@ -14,7 +14,7 @@ de *Nichola Lacey*
|
|||||||
- [045-051](./basic/basic06.py)
|
- [045-051](./basic/basic06.py)
|
||||||
- [052-059](./basic/basic07.py)
|
- [052-059](./basic/basic07.py)
|
||||||
|
|
||||||
## Retos Turtle
|
### Retos Turtle
|
||||||
|
|
||||||
- [060](./trtl/turtle01.py)
|
- [060](./trtl/turtle01.py)
|
||||||
- [061](./trtl/turtle02.py)
|
- [061](./trtl/turtle02.py)
|
||||||
@ -26,7 +26,7 @@ de *Nichola Lacey*
|
|||||||
- [067](./trtl/turtle08.py)
|
- [067](./trtl/turtle08.py)
|
||||||
- [068](./trtl/turtle09.py)
|
- [068](./trtl/turtle09.py)
|
||||||
|
|
||||||
## Retos Intermedios
|
### Retos Intermedios
|
||||||
|
|
||||||
- [069-079](./interm/interm01.py)
|
- [069-079](./interm/interm01.py)
|
||||||
- [080-087](./interm/interm02.py)
|
- [080-087](./interm/interm02.py)
|
||||||
@ -36,6 +36,24 @@ de *Nichola Lacey*
|
|||||||
- [111-117](./interm/interm06.py)
|
- [111-117](./interm/interm06.py)
|
||||||
- [118-123](./interm/interm07.py)
|
- [118-123](./interm/interm07.py)
|
||||||
|
|
||||||
|
### Retos Tkinter
|
||||||
|
|
||||||
|
- [124](./tkgui/tk01.py)
|
||||||
|
- [125](./tkgui/tk02.py)
|
||||||
|
- [126](./tkgui/tk03.py)
|
||||||
|
- [127](./tkgui/tk04.py)
|
||||||
|
- [128](./tkgui/tk05.py)
|
||||||
|
- [129](./tkgui/tk06.py)
|
||||||
|
- [130](./tkgui/tk07.py)
|
||||||
|
- [131](./tkgui/tk08.py)
|
||||||
|
- [132](./tkgui/tk09.py)
|
||||||
|
- [133](./tkgui/tk10.py)
|
||||||
|
- [134](./tkgui/tk11.py)
|
||||||
|
- [135](./tkgui/tk12.py)
|
||||||
|
- [136](./tkgui/tk13.py)
|
||||||
|
- [137](./tkgui/tk14.py)
|
||||||
|
- [138](./tkgui/tk15.py)
|
||||||
|
|
||||||
## Uso
|
## Uso
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
19
main.py
@ -13,7 +13,8 @@ def toc():
|
|||||||
3) Intermedios 069-123
|
3) Intermedios 069-123
|
||||||
4) Tkinter 124-138
|
4) Tkinter 124-138
|
||||||
5) SQLite 139-145
|
5) SQLite 139-145
|
||||||
...
|
6) Finales 146-150
|
||||||
|
|
||||||
s) Salir
|
s) Salir
|
||||||
"""
|
"""
|
||||||
print(content)
|
print(content)
|
||||||
@ -104,12 +105,12 @@ def tkinter_challenges():
|
|||||||
clear()
|
clear()
|
||||||
print(content)
|
print(content)
|
||||||
opcs_default(1)
|
opcs_default(1)
|
||||||
selection = user_input(1)
|
selection = user_input(2)
|
||||||
match selection:
|
match selection:
|
||||||
case 1:
|
case 1:
|
||||||
tkgui.challenges01()
|
tkgui.challenges01()
|
||||||
case 2:
|
case 2:
|
||||||
#tkgui.challenges02()
|
tkgui.challenges02()
|
||||||
pass
|
pass
|
||||||
case 'v':
|
case 'v':
|
||||||
return
|
return
|
||||||
@ -132,7 +133,7 @@ def main():
|
|||||||
clear()
|
clear()
|
||||||
print(header)
|
print(header)
|
||||||
toc()
|
toc()
|
||||||
selection = user_input(10)
|
selection = user_input(6)
|
||||||
match selection:
|
match selection:
|
||||||
case 1:
|
case 1:
|
||||||
basic_challenges()
|
basic_challenges()
|
||||||
@ -143,16 +144,10 @@ def main():
|
|||||||
case 4:
|
case 4:
|
||||||
tkinter_challenges()
|
tkinter_challenges()
|
||||||
case 5:
|
case 5:
|
||||||
|
#sqlite_challenges()
|
||||||
pass
|
pass
|
||||||
case 6:
|
case 6:
|
||||||
pass
|
#final_challenges()
|
||||||
case 7:
|
|
||||||
pass
|
|
||||||
case 8:
|
|
||||||
pass
|
|
||||||
case 9:
|
|
||||||
pass
|
|
||||||
case 10:
|
|
||||||
pass
|
pass
|
||||||
case 's':
|
case 's':
|
||||||
select_ok = True
|
select_ok = True
|
||||||
|
57
tkgui/example02.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
|
||||||
|
window = tk.Tk()
|
||||||
|
window.geometry("606x606")
|
||||||
|
window.configure(background="cyan")
|
||||||
|
|
||||||
|
title_icon = tk.PhotoImage(file = "./imgs/devfzn_64x64.png")
|
||||||
|
window.iconphoto(False, title_icon)
|
||||||
|
|
||||||
|
#logo = tk.PhotoImage(file = "./imgs/devfzn_250x250.png")
|
||||||
|
#logoimage = tk.Label(image=logo)
|
||||||
|
#logoimage.place(x=3, y=3, width=600, height=600)
|
||||||
|
|
||||||
|
# Re-asignable
|
||||||
|
photo1 = tk.PhotoImage(file = "./imgs/devfzn_250x250.png")
|
||||||
|
photobox1 = tk.Label(window, image=photo1)
|
||||||
|
photobox1["image"] = photo1
|
||||||
|
photobox1.place(x=3,y=3,width=600,height=600)
|
||||||
|
|
||||||
|
sel_name = tk.StringVar(window)
|
||||||
|
sel_name.set("Selecciona nombre")
|
||||||
|
lst_name = tk.OptionMenu(window, sel_name, "Bob", "Ret", "Znorb")
|
||||||
|
lst_name.place(x=253, y=75)
|
||||||
|
|
||||||
|
photo2 = tk.PhotoImage(file = "./imgs/img_4.png")
|
||||||
|
photobox2 = tk.Label(window, image=photo2)
|
||||||
|
photobox2.place(x=203,y=203,width=250,height=250)
|
||||||
|
|
||||||
|
lbl_msg = tk.Message(text='', font="Verdana 48")
|
||||||
|
lbl_msg.place(x=80, y=520, width=420, height=60)
|
||||||
|
lbl_msg["justify"] = "center"
|
||||||
|
|
||||||
|
def clicked():
|
||||||
|
sel = sel_name.get()
|
||||||
|
msg = f"Hola {sel}"
|
||||||
|
lbl_msg["text"] = msg
|
||||||
|
match sel:
|
||||||
|
case 'Bob':
|
||||||
|
photo = tk.PhotoImage(file = "./imgs/img_1.png")
|
||||||
|
photobox2.image = photo
|
||||||
|
case 'Ret':
|
||||||
|
photo = tk.PhotoImage(file = "./imgs/img_2.png")
|
||||||
|
photobox2.image = photo
|
||||||
|
case 'Znorb':
|
||||||
|
photo = tk.PhotoImage(file = "./imgs/img_3.png")
|
||||||
|
photobox2.image = photo
|
||||||
|
case _:
|
||||||
|
photo = tk.PhotoImage(file = "./imgs/devfzn_250x250.png")
|
||||||
|
photobox2.image = photo
|
||||||
|
photobox2["image"] = photo
|
||||||
|
photobox2.update()
|
||||||
|
|
||||||
|
button = tk.Button(text="Click", command=clicked)
|
||||||
|
button.place(x=253, y=30, width=150, height=25)
|
||||||
|
|
||||||
|
window.mainloop()
|
BIN
tkgui/imgs/devfzn_100x100.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
tkgui/imgs/devfzn_250x250.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
tkgui/imgs/devfzn_64x64.png
Normal file
After Width: | Height: | Size: 4.0 KiB |
BIN
tkgui/imgs/error.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
tkgui/imgs/iconart.png
Normal file
After Width: | Height: | Size: 7.8 KiB |
BIN
tkgui/imgs/img_1.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
tkgui/imgs/img_2.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
tkgui/imgs/img_3.png
Normal file
After Width: | Height: | Size: 71 KiB |
BIN
tkgui/imgs/img_4.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
tkgui/imgs/ini.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
tkgui/imgs/ok.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
53
tkgui/tk10.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
from os import getcwd as pwd
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
def tk_10():
|
||||||
|
"""Create your own icon that consists of several vertical multi-coloured
|
||||||
|
lines. Create a logo which measures 200 x 150, using Paint or another
|
||||||
|
graphics package. Create the following window using your own icon and
|
||||||
|
logo.When the user enters their name and clicks on the Press Me button
|
||||||
|
it should display "Hello" and their name in the second text box."""
|
||||||
|
base_path = f"{pwd()}/tkgui/imgs"
|
||||||
|
c_bg="magenta"
|
||||||
|
window = tk.Tk()
|
||||||
|
window.geometry("400x300")
|
||||||
|
window.configure(background=c_bg)
|
||||||
|
|
||||||
|
title_icon = tk.PhotoImage(file = f"{base_path}/devfzn_64x64.png")
|
||||||
|
window.iconphoto(False, title_icon)
|
||||||
|
window.title("Saludo Tk")
|
||||||
|
|
||||||
|
photo1 = tk.PhotoImage(file = f"{base_path}/img_4.png")
|
||||||
|
photobox1 = tk.Label(window, image=photo1)
|
||||||
|
photobox1["image"] = photo1
|
||||||
|
photobox1["bg"] = c_bg
|
||||||
|
photobox1.place(x=70,y=0,width=250,height=200)
|
||||||
|
|
||||||
|
name_in = tk.Entry()
|
||||||
|
name_in.place(x=120, y=200, width=160, height=30)
|
||||||
|
|
||||||
|
lbl_name = tk.Message(text="Nombre", font="Verdana 12")
|
||||||
|
lbl_name["bg"] = c_bg
|
||||||
|
lbl_name["width"] = 70
|
||||||
|
lbl_name["justify"] = "center"
|
||||||
|
lbl_name.place(x=40, y=200, width=70, height=30)
|
||||||
|
|
||||||
|
lbl_msg = tk.Message(text="", font="Verdana 18")
|
||||||
|
lbl_msg.place(x=160, y=240, width=200, height=30)
|
||||||
|
lbl_msg["justify"] = "left"
|
||||||
|
lbl_msg["width"] = 200
|
||||||
|
lbl_msg["bg"] = c_bg
|
||||||
|
|
||||||
|
def clicked():
|
||||||
|
sel = name_in.get()
|
||||||
|
name_in["text"] = ""
|
||||||
|
msg = f"Hola {sel}"
|
||||||
|
lbl_msg["text"] = msg
|
||||||
|
name_in.focus()
|
||||||
|
|
||||||
|
button = tk.Button(text="Click", command=clicked)
|
||||||
|
button.place(x=40, y=240, width=100, height=30)
|
||||||
|
name_in.focus()
|
||||||
|
|
||||||
|
|
||||||
|
window.mainloop()
|
97
tkgui/tk11.py
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
from os import getcwd as pwd
|
||||||
|
import tkinter as tk
|
||||||
|
from random import randint
|
||||||
|
|
||||||
|
def tk_11():
|
||||||
|
"""Create a new program that will generate two random whole numbers between
|
||||||
|
10 and 50. It should ask the user to add the numbers together and type in
|
||||||
|
the answer. If they get the question correct, display a suitable image such
|
||||||
|
as a tick; if they get the answer wrong, display another suitable image such
|
||||||
|
as a cross. They should click on a Next button to get another question."""
|
||||||
|
base_path = f"{pwd()}/tkgui/imgs"
|
||||||
|
window = tk.Tk()
|
||||||
|
window.title("Sumas TK")
|
||||||
|
window.geometry("380x470")
|
||||||
|
|
||||||
|
title_icon = tk.PhotoImage(file = f"{base_path}/devfzn_64x64.png")
|
||||||
|
window.iconphoto(False, title_icon)
|
||||||
|
|
||||||
|
def generate():
|
||||||
|
num = randint(10,50)
|
||||||
|
txt_box_1["fg"] = "black"
|
||||||
|
txt_box_1["bg"] = "magenta"
|
||||||
|
txt_box_1["text"] = f"{num}"
|
||||||
|
num = randint(10,50)
|
||||||
|
txt_box_2["fg"] = "black"
|
||||||
|
txt_box_2["bg"] = "magenta"
|
||||||
|
txt_box_2["text"] = f"{num}"
|
||||||
|
txt_num_in.delete(0, 'end')
|
||||||
|
img_ini = tk.PhotoImage(file = f"{base_path}/ini.png")
|
||||||
|
box_img.image = img_ini
|
||||||
|
box_img["image"] = img_ini
|
||||||
|
box_img.update()
|
||||||
|
lbl_resp["text"] = ""
|
||||||
|
txt_num_in.focus()
|
||||||
|
|
||||||
|
lbl_info = tk.Label(text="SUMA", font="Verdana 50")
|
||||||
|
lbl_info.place(x=40, y=25, width=300, height=75)
|
||||||
|
|
||||||
|
txt_box_1 = tk.Message(text="", font="Verdana 30")
|
||||||
|
txt_box_1["fg"] = "red"
|
||||||
|
txt_box_1["bg"] = "cyan"
|
||||||
|
txt_box_1["justify"] = "center"
|
||||||
|
txt_box_1["width"] = 80
|
||||||
|
txt_box_1.place(x=40, y=160, width=80, height=80)
|
||||||
|
|
||||||
|
lbl_plus = tk.Label(text="+", font="Verdana 20")
|
||||||
|
lbl_plus.place(x=125, y=185, width=20, height=20)
|
||||||
|
lbl_equal = tk.Label(text="=", font="Verdana 20")
|
||||||
|
lbl_equal.place(x=235, y=185, width=20, height=20)
|
||||||
|
|
||||||
|
txt_box_2 = tk.Message(text="", font="Verdana 30")
|
||||||
|
txt_box_2["fg"] = "red"
|
||||||
|
txt_box_2["bg"] = "cyan"
|
||||||
|
txt_box_2["justify"] = "center"
|
||||||
|
txt_box_2["width"] = 80
|
||||||
|
txt_box_2.place(x=150, y=160, width=80, height=80)
|
||||||
|
|
||||||
|
def check():
|
||||||
|
num_1 = txt_box_1["text"]
|
||||||
|
num_2 = txt_box_2["text"]
|
||||||
|
resp = txt_num_in.get()
|
||||||
|
resp = resp.replace(' ', '')
|
||||||
|
if resp.isdigit() and (int(resp) == int(num_1)+int(num_2)):
|
||||||
|
lbl_resp["text"] = "¡Correcto!"
|
||||||
|
img_resp = tk.PhotoImage(file = f"{base_path}/ok.png")
|
||||||
|
box_img.image = img_resp
|
||||||
|
else:
|
||||||
|
lbl_resp["text"] = "¡Incorrecto!"
|
||||||
|
img_resp = tk.PhotoImage(file = f"{base_path}/error.png")
|
||||||
|
box_img.image = img_resp
|
||||||
|
box_img["image"] = img_resp
|
||||||
|
box_img.update()
|
||||||
|
btn_launch.focus()
|
||||||
|
|
||||||
|
btn_launch = tk.Button(text="Generar", command=generate)
|
||||||
|
btn_launch.place(x=40, y=110, width=300, height=35)
|
||||||
|
btn_launch.focus()
|
||||||
|
|
||||||
|
txt_num_in = tk.Entry(font="Verdana 30")
|
||||||
|
txt_num_in["fg"] = "black"
|
||||||
|
txt_num_in["bg"] = "cyan"
|
||||||
|
txt_num_in["justify"] = "center"
|
||||||
|
txt_num_in["width"] = 4
|
||||||
|
txt_num_in.place(x=265, y=160, width=80, height=80)
|
||||||
|
|
||||||
|
btn_check = tk.Button(text="Comprobar", command=check)
|
||||||
|
btn_check.place(x=40, y=260, width=300, height=35)
|
||||||
|
|
||||||
|
lbl_resp = tk.Label(text="", font="Verdana 20")
|
||||||
|
lbl_resp.place(x=40, y=400, width=300, height=75)
|
||||||
|
|
||||||
|
img_ini = tk.PhotoImage(file = f"{base_path}/ini.png")
|
||||||
|
box_img = tk.Label(window, image=img_ini)
|
||||||
|
box_img["image"] = img_ini
|
||||||
|
box_img.place(x=138,y=310,width=100,height=100)
|
||||||
|
|
||||||
|
window.mainloop()
|
57
tkgui/tk12.py
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
from os import getcwd as pwd
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
def tk_12():
|
||||||
|
"""Create a simple program that shows a drop-down list containing several
|
||||||
|
colours and a Click Me button. When the user selects a colour from the list
|
||||||
|
and clicks the button it should change the background of the window to that
|
||||||
|
colour. For an extra challenge, try to avoid using an if statement to do this."""
|
||||||
|
base_path = f"{pwd()}/tkgui/imgs"
|
||||||
|
window = tk.Tk()
|
||||||
|
window.title("Colores TK")
|
||||||
|
window.geometry("380x400")
|
||||||
|
|
||||||
|
title_icon = tk.PhotoImage(file = f"{base_path}/devfzn_64x64.png")
|
||||||
|
window.iconphoto(False, title_icon)
|
||||||
|
window["bg"] = "white"
|
||||||
|
|
||||||
|
colours = [
|
||||||
|
'dark slate gray',
|
||||||
|
'slate gray',
|
||||||
|
'cornflower blue',
|
||||||
|
'dodger blue',
|
||||||
|
'deep sky blue',
|
||||||
|
'dark turquoise',
|
||||||
|
'pale goldenrod',
|
||||||
|
'tomato',
|
||||||
|
'violet red',
|
||||||
|
'purple',
|
||||||
|
'DarkOrchid2',
|
||||||
|
'DarkOrchid4',
|
||||||
|
]
|
||||||
|
|
||||||
|
lbl_info = tk.Label(text="COLORES", font="Verdana 50")
|
||||||
|
lbl_info["bg"] = "white"
|
||||||
|
lbl_info.place(x=40, y=25, width=300, height=75)
|
||||||
|
|
||||||
|
lst_color = tk.Listbox()
|
||||||
|
for i, color in enumerate(colours):
|
||||||
|
lst_color.insert(i, color)
|
||||||
|
lst_color["justify"] = "center"
|
||||||
|
lst_color.place(x=40, y=160, width=300, height=220)
|
||||||
|
|
||||||
|
def apply_color():
|
||||||
|
try:
|
||||||
|
color = lst_color.curselection()[0]
|
||||||
|
window["bg"] = colours[color]
|
||||||
|
lbl_info["bg"] = colours[color]
|
||||||
|
except IndexError:
|
||||||
|
window["bg"] = "white"
|
||||||
|
lbl_info["bg"] = "white"
|
||||||
|
lst_color.focus()
|
||||||
|
|
||||||
|
btn_chng_color = tk.Button(text="Aplicar Color", command=apply_color)
|
||||||
|
btn_chng_color.place(x=40, y=110, width=300, height=35)
|
||||||
|
btn_chng_color.focus()
|
||||||
|
|
||||||
|
window.mainloop()
|
60
tkgui/tk13.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
from os import getcwd as pwd
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
def tk_13():
|
||||||
|
"""Create a program that will ask the user to enter a name and then select
|
||||||
|
the gender for that person from a drop-down list. It should then add the
|
||||||
|
name and the gender (separated by a comma) to a list box when the user
|
||||||
|
clicks on a button."""
|
||||||
|
base_path = f"{pwd()}/tkgui/imgs"
|
||||||
|
window = tk.Tk()
|
||||||
|
window.title("Personal Data TK")
|
||||||
|
window.geometry("590x200")
|
||||||
|
|
||||||
|
title_icon = tk.PhotoImage(file = f"{base_path}/devfzn_64x64.png")
|
||||||
|
window.iconphoto(False, title_icon)
|
||||||
|
common_bg = "dodger blue"
|
||||||
|
window["bg"] = common_bg
|
||||||
|
|
||||||
|
gender_ops = [ 'Privado', 'Masculino', 'Femenino', 'Otro' ]
|
||||||
|
|
||||||
|
lbl_info = tk.Label(text="Lista Usuarios", font="Verdana 18")
|
||||||
|
lbl_info["bg"] = common_bg
|
||||||
|
lbl_info.place(x=20, y=20, width=200, height=20)
|
||||||
|
|
||||||
|
box_name = tk.Entry()
|
||||||
|
box_name["justify"] = "left"
|
||||||
|
box_name.place(x=120, y=62, width=140, height=30)
|
||||||
|
box_name.focus()
|
||||||
|
|
||||||
|
sel_gen = tk.StringVar(window)
|
||||||
|
sel_gen.set("género")
|
||||||
|
lst_genders = tk.OptionMenu(window, sel_gen, *gender_ops)
|
||||||
|
lst_genders.place(x=275, y=60, width=100)
|
||||||
|
|
||||||
|
lst_users = tk.Listbox()
|
||||||
|
lst_users["justify"] = "center"
|
||||||
|
lst_users.place(x=400, y=50, width=150, height=100)
|
||||||
|
|
||||||
|
def add_user():
|
||||||
|
name = box_name.get()
|
||||||
|
gender = sel_gen.get()
|
||||||
|
if gender != "género" and name != '':
|
||||||
|
new_user = f"{name},{gender}"
|
||||||
|
lst_users.insert('end', new_user)
|
||||||
|
box_name.delete(0,'end')
|
||||||
|
sel_gen.set("género")
|
||||||
|
box_name.focus()
|
||||||
|
else:
|
||||||
|
lst_genders.focus()
|
||||||
|
|
||||||
|
btn_add = tk.Button(text="Agregar usuario", command=add_user)
|
||||||
|
btn_add.place(x=40, y=110, width=340, height=35)
|
||||||
|
|
||||||
|
lbl_name = tk.Message(text="NOMBRE", font="Verdana 12")
|
||||||
|
lbl_name["bg"] = common_bg
|
||||||
|
lbl_name["width"] = 70
|
||||||
|
lbl_name["justify"] = "left"
|
||||||
|
lbl_name.place(x=40, y=62, width=70, height=25)
|
||||||
|
|
||||||
|
window.mainloop()
|
75
tkgui/tk14.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
from os import getcwd as pwd
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
def tk_14():
|
||||||
|
"""Change program 136 so that when a new name and gender is added to the
|
||||||
|
list box it is also written to a text file. Add another button that will
|
||||||
|
display the entire text file in the main Python shell window."""
|
||||||
|
base_path = f"{pwd()}/tkgui/imgs"
|
||||||
|
file_path = f"{pwd()}/tkgui/files/users.txt"
|
||||||
|
window = tk.Tk()
|
||||||
|
window.title("Personal Data TK")
|
||||||
|
window.geometry("590x220")
|
||||||
|
|
||||||
|
title_icon = tk.PhotoImage(file = f"{base_path}/devfzn_64x64.png")
|
||||||
|
window.iconphoto(False, title_icon)
|
||||||
|
common_bg = "dodger blue"
|
||||||
|
window["bg"] = common_bg
|
||||||
|
|
||||||
|
gender_ops = [ 'Privado', 'Masculino', 'Femenino', 'Otro' ]
|
||||||
|
|
||||||
|
lbl_info = tk.Label(text="Lista Usuarios", font="Verdana 18")
|
||||||
|
lbl_info["bg"] = common_bg
|
||||||
|
lbl_info.place(x=20, y=20, width=200, height=20)
|
||||||
|
|
||||||
|
box_name = tk.Entry()
|
||||||
|
box_name["justify"] = "left"
|
||||||
|
box_name.place(x=120, y=62, width=140, height=30)
|
||||||
|
box_name.focus()
|
||||||
|
|
||||||
|
sel_gen = tk.StringVar(window)
|
||||||
|
sel_gen.set("género")
|
||||||
|
lst_genders = tk.OptionMenu(window, sel_gen, *gender_ops)
|
||||||
|
lst_genders.place(x=275, y=60, width=100)
|
||||||
|
|
||||||
|
lst_users = tk.Listbox()
|
||||||
|
lst_users["justify"] = "center"
|
||||||
|
lst_users.place(x=400, y=50, width=150, height=140)
|
||||||
|
|
||||||
|
def add_user():
|
||||||
|
name = box_name.get()
|
||||||
|
gender = sel_gen.get()
|
||||||
|
if gender != "género" and name != '':
|
||||||
|
new_user = f"{name},{gender}"
|
||||||
|
lst_users.insert('end', new_user)
|
||||||
|
box_name.delete(0,'end')
|
||||||
|
sel_gen.set("género")
|
||||||
|
box_name.focus()
|
||||||
|
with open(file_path, '+a') as file:
|
||||||
|
file.write(new_user+"\n")
|
||||||
|
else:
|
||||||
|
lst_genders.focus()
|
||||||
|
|
||||||
|
def show_users():
|
||||||
|
print(("NOMBRE".rjust(10)).ljust(15), "GENERO".rjust(10))
|
||||||
|
with open(file_path, 'r') as file:
|
||||||
|
users = file.readlines()
|
||||||
|
for user in users:
|
||||||
|
name = user.split(',')[0]
|
||||||
|
gender = user.split(',')[1].replace('\n','')
|
||||||
|
print((name.rjust(10)).ljust(15),
|
||||||
|
(gender.ljust(10)).rjust(12))
|
||||||
|
|
||||||
|
btn_add = tk.Button(text="Agregar usuario", command=add_user)
|
||||||
|
btn_add.place(x=40, y=110, width=340, height=35)
|
||||||
|
|
||||||
|
lbl_name = tk.Message(text="NOMBRE", font="Verdana 12")
|
||||||
|
lbl_name["bg"] = common_bg
|
||||||
|
lbl_name["width"] = 70
|
||||||
|
lbl_name["justify"] = "left"
|
||||||
|
lbl_name.place(x=40, y=62, width=70, height=25)
|
||||||
|
|
||||||
|
btn_show = tk.Button(text="Mostrar en Consola", command=show_users)
|
||||||
|
btn_show.place(x=40, y=150, width=340, height=35)
|
||||||
|
|
||||||
|
window.mainloop()
|
53
tkgui/tk15.py
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
from os import getcwd as pwd
|
||||||
|
import tkinter as tk
|
||||||
|
|
||||||
|
def tk_15():
|
||||||
|
"""Save several images in the same folder as your program and call them
|
||||||
|
1.gif, 2.gif, 3.gif, etc. Make sure they are all .gif files. Display one
|
||||||
|
in a window and ask the user to enter a number. It should then use that
|
||||||
|
number to choose the correct file name and display the correct image."""
|
||||||
|
path_base = f"{pwd()}/tkgui/imgs"
|
||||||
|
com_bg = "DarkOrchid2"
|
||||||
|
window = tk.Tk()
|
||||||
|
window.geometry("310x420")
|
||||||
|
window.configure(background=com_bg)
|
||||||
|
|
||||||
|
title_icon = tk.PhotoImage(file = f"{path_base}/devfzn_64x64.png")
|
||||||
|
window.iconphoto(False, title_icon)
|
||||||
|
|
||||||
|
photo1 = tk.PhotoImage(file = f"{path_base}/devfzn_250x250.png")
|
||||||
|
lbl_img = tk.Label(window, image=photo1)
|
||||||
|
lbl_img["image"] = photo1
|
||||||
|
lbl_img["bg"] = com_bg
|
||||||
|
lbl_img.place(x=30,y=160,width=250,height=250)
|
||||||
|
|
||||||
|
ent_num = tk.Entry(font="Verdana 20")
|
||||||
|
ent_num["justify"] = "center"
|
||||||
|
ent_num.place(x=200, y=100, width=50, height=50)
|
||||||
|
|
||||||
|
lbl_msg = tk.Message(text="Ingresa un número (1-4)", font="Verdana 16")
|
||||||
|
lbl_msg["width"] = 150
|
||||||
|
lbl_msg["bg"] = com_bg
|
||||||
|
lbl_msg["justify"] = "center"
|
||||||
|
lbl_msg.place(x=40, y=95, width=150, height=60)
|
||||||
|
|
||||||
|
def clicked():
|
||||||
|
sel = ent_num.get()
|
||||||
|
sel = sel.replace(' ', '')
|
||||||
|
if sel.isdigit() and (0 < int(sel) < 5):
|
||||||
|
photo = tk.PhotoImage(file = f"{path_base}/img_{sel}.png")
|
||||||
|
lbl_img.image = photo
|
||||||
|
else:
|
||||||
|
ent_num.delete(0, 'end')
|
||||||
|
photo = tk.PhotoImage(file = f"{path_base}/error.png")
|
||||||
|
lbl_img.image = photo
|
||||||
|
lbl_img["image"] = photo
|
||||||
|
lbl_img.update()
|
||||||
|
ent_num.focus()
|
||||||
|
|
||||||
|
button = tk.Button(text="Click", command=clicked)
|
||||||
|
button["bg"] = "tomato"
|
||||||
|
button.place(x=40, y=30, width=220, height=50)
|
||||||
|
ent_num.focus()
|
||||||
|
|
||||||
|
window.mainloop()
|
@ -1,17 +1,25 @@
|
|||||||
from . import tk01 as ex01
|
from . import (
|
||||||
from . import tk02 as ex02
|
tk01 as ex01,
|
||||||
from . import tk03 as ex03
|
tk02 as ex02,
|
||||||
from . import tk04 as ex04
|
tk03 as ex03,
|
||||||
from . import tk05 as ex05
|
tk04 as ex04,
|
||||||
from . import tk06 as ex06
|
tk05 as ex05,
|
||||||
from . import tk07 as ex07
|
tk06 as ex06,
|
||||||
from . import tk08 as ex08
|
tk07 as ex07,
|
||||||
from . import tk09 as ex09
|
tk08 as ex08,
|
||||||
|
tk09 as ex09,
|
||||||
|
tk10 as ex10,
|
||||||
|
tk11 as ex11,
|
||||||
|
tk12 as ex12,
|
||||||
|
tk13 as ex13,
|
||||||
|
tk14 as ex14,
|
||||||
|
tk15 as ex15
|
||||||
|
)
|
||||||
from common.common import (
|
from common.common import (
|
||||||
user_input,
|
user_input,
|
||||||
print_run_func,
|
print_run_func,
|
||||||
opcs_default,
|
opcs_default,
|
||||||
clear
|
clear
|
||||||
)
|
)
|
||||||
|
|
||||||
tab = ' '
|
tab = ' '
|
||||||
@ -57,3 +65,36 @@ def challenges01():
|
|||||||
exit(0)
|
exit(0)
|
||||||
case _:
|
case _:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
def challenges02():
|
||||||
|
select_ok = False
|
||||||
|
while not select_ok:
|
||||||
|
clear()
|
||||||
|
print(tab, '1)', ex10.tk_10.__doc__)
|
||||||
|
print(tab, '2)', ex11.tk_11.__doc__)
|
||||||
|
print(tab, '3)', ex12.tk_12.__doc__)
|
||||||
|
print(tab, '4)', ex13.tk_13.__doc__)
|
||||||
|
print(tab, '5)', ex14.tk_14.__doc__)
|
||||||
|
print(tab, '6)', ex15.tk_15.__doc__)
|
||||||
|
opcs_default(1)
|
||||||
|
selection = user_input(6)
|
||||||
|
match selection:
|
||||||
|
case 1:
|
||||||
|
print_run_func(ex10.tk_10)
|
||||||
|
case 2:
|
||||||
|
print_run_func(ex11.tk_11)
|
||||||
|
case 3:
|
||||||
|
print_run_func(ex12.tk_12)
|
||||||
|
case 4:
|
||||||
|
print_run_func(ex13.tk_13)
|
||||||
|
case 5:
|
||||||
|
print_run_func(ex14.tk_14)
|
||||||
|
case 6:
|
||||||
|
print_run_func(ex15.tk_15)
|
||||||
|
case 'v':
|
||||||
|
return
|
||||||
|
case 's':
|
||||||
|
select_ok = True
|
||||||
|
exit(0)
|
||||||
|
case _:
|
||||||
|
continue
|
||||||
|