Mostrando entradas con la etiqueta python. Mostrar todas las entradas
Mostrando entradas con la etiqueta python. Mostrar todas las entradas

lunes, 20 de mayo de 2024

Redes con Python: Programación de Sockets para la Comunicación. 1.- Usando Sockets con Python.

Python tiene una API que nos permite comunicarnos con otras programas a través de una red. Vamos a empezar viendo como usar esta API para crear un servidor y usar tu navegador para conectarnos a él. Lo primero que vamos a hacer es crear un nuevo programa de Python al que llamaremos server.py

Para poder usar el API tenemos que importar el módulo socket, de esta forma:

server.py

import socket
Esta línea importa el módulo "socket" que nos proporciona acceso a la interfaz de sockets de red de bajo nivel. Nos va a permitir realizar operaciones de red, como establecer conexiones y trasferir datos entre sistemas.

Luego crearemos el socket. Lo llamaré server_socket y tendrá unos parámetros que van a determinar el tipo de protocolo utilizado.

server.py

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  • socket.socket(): Es la función que crea un nuevo socket.
  • socket.AF_INET: Especifica la familia de direcciones que el socket puede usar. AF_INET significa que el socket utilizará direcciones IPv4. Si quisieras usar direcciones IPv6, usarías AF_INET6.
  • socket.SOCK_STREAM: Especifica el tipo de socket. SOCK_STREAM indica que se va a usar un socket de flujo, lo que significa que se trata de un socket orientado a la conexión y basado en TCP (Transmission Control Protocol). TCP es un protocolo que proporciona una conexión confiable y orientada a la conexión para el intercambio de datos.

En conclusión, hemos creado un socket TCP/IP. A continuación tenemos que vincular ese socket con una dirección y un puerto especifico. 

server.py

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM
server_socket.bind(('0.0.0.0', 8081))
Usaremos la dirección 0.0.0.0 y el puerto 8081. 

La dirección 0.0.0.0 se utiliza en la función bind() de los sockets para indicar que el socket debe aceptar conexiones en todas las interfaces de red disponibles del sistema. Es una dirección especial que no se refiere a una sola dirección IP específica, sino a todas las direcciones IP configuradas en el dispositivo. Vamos a explorar esto con más detalle:

Contexto de Uso de 0.0.0.0

  • 0.0.0.0: Acepta conexiones en todas las interfaces de red del sistema. Esto significa que el servidor será accesible desde cualquier dirección IP que tenga el sistema (por ejemplo, desde localhost, direcciones privadas, y direcciones públicas, si están configuradas). También es equivalente a dejar este argumento en blanco "".
  • 127.0.0.1: Acepta conexiones solo desde la interfaz de loopback (localhost). Esto significa que el servidor solo será accesible desde el mismo sistema u ordenador donde está ejecutándose y no desde otras máquinas.
  • Dirección IP específica (como 192.168.1.10): Acepta conexiones solo en esa dirección IP específica. Esto puede ser útil si solo quieres que tu servidor esté accesible a través de una interfaz de red particular.
Es decir cualquier conexión que se solicite a nuestro ordenador activará el socket en el puerto 8081.

Por otra parte, los puertos se utilizan normalmente para identificar el propósito de la conexión. Se puede utilizar cualquier número entre el 0 y el 65535. No obstante ten en cuenta que los puertos entre el 0 y el 1023 se les llama "Puertos Bien Conocidos" y suelen estar restringidos a usos específicos. Por ejemplo:

puertos en un ordenador


Podríamos haber usado cualquier otro puerto, pero hemos optado por el 8081 que se suele utilizar para testear.

Preparemos al servidor para que se ponga a escuchar las peticiones entrantes. Vamos también a poner un mensaje en la pantalla, que indique que el servidor está esperando la conexión y podemos también limitar el número de conexiones entrantes. (5 en este caso)

server.py

import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Vincula el socket a una dirección y puerto específicos
server_socket.bind(('0.0.0.0', 8081))

# Escucha conexiones entrantes (el argumento especifica el tamaño máximo de la cola de conexiones)
server_socket.listen(5)

print("Servidor escuchando en el puerto 8080...")
Ya tenemos al servidor esperando a las conexiones. Una vez que tenga una petición tiene que aceptarlas. Así que vamos a prepararlo todo:

server.py

import socket

# Creamos el socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Vincula el socket a una dirección y puerto específicos
server_socket.bind(('0.0.0.0', 8081))

# Escucha conexiones entrantes (el argumento especifica el 
# número máximo de solicitudes de conexión en cola)
server_socket.listen(5)

print("Servidor escuchando en el puerto 8081...")

# Aceptar una conexión
client_socket, client_address = server_socket.accept()
print(f"Conexión aceptada de {client_address}")

El programa está esperando que se realice una conexión y cuando esto se produce, se devuelven dos parámetros. 

El primero "client_socketes un nuevo objeto de socket que representa la conexión específica con el cliente que ha hecho la solicitud de conexión. Este socket se usa para enviar y recibir datos a y desde el cliente. Cada vez que un cliente se conecta al servidor, el método accept() crea un nuevo socket para manejar esa conexión individual, permitiendo que el servidor continúe escuchando nuevas conexiones en el socket original.

Para que quede claro. Un socket_server no manda ningún dato. No recibe ningún dato. Solo produce sockets clientes. Cada client_socket es creado en respuesta a algún otro socket cliente que hace connect al host y puerto al que estamos vinculado. Tan pronto como hemos creado ese cliente_socket volvemos a escuchar por más conexiones. Los dos "clientes" son libres de conversar entre ellos - están usando algún puerto asignado dinámicamente que será reciclado cuando la conversación termine.

Cualquier software que sea capaz de conectarse mediante TCP podrá establecer una conexión con nuestro programa de servidor, como un navegador web o un terminal. Ahora, en el siguiente paso, vamos a crear tu propio cliente, pero antes vamos a probar que nuestro programa funciona usando tu navegador web para conectarse. Así que ejecutemos nuestro programa.

El segundo "client_address" es una tupla que contiene la dirección IP y el número de puerto del cliente que ha establecido la conexión con el servidor. Este parámetro proporciona información sobre la ubicación de red del cliente.

Pondremos un mensaje en pantalla para indicar que se ha realizado la conexión.


>>> python3 server.py
Servidor escuchando en el puerto 8081...

Podemos ver que está esperando una conexión. Abre un navegador web y ve a la dirección 127.0.0.1, que es la dirección local de tu ordenador. Usa el puerto 8081 porque ese es el puerto en el que programa está escuchando. (http://127.0.0.1:8081/)

>>> python3 server.py
Servidor escuchando en el puerto 8081...
Conexión aceptada de ('127.0.0.1', 45438)
Aunque el navegador web no muestra ninguna información, podemos ver que está conectado. ¿Por que el navegador no muestra nada? ¿Qué tendrías que hacer para que el navegador responda?  Lo veremos en el próximo post.

Puedes encontrar el código de este post en el siguiente enlace.

miércoles, 15 de mayo de 2024

Creaciones Coloridas

 Proyecto adaptado de los proyectos para Python de la rapsberrypi.org "Colorful Creations".

Introducción.

En este proyecto vamos a ver como podemos utilizar un diccionario de colores para poder recordar códigos de colores que nos gusten de una forma fácil de utilizar.


Usando códigos de colores en formato hexadecimal.


Para este post vamos a utilizar el modulo Turtle de Python. En este módulo se pueden usar colores predefinidos con sus nombres en inglés como red (rojo), white (blanco) etc. Pero tambien puedes usar los colores que prefieras usando valores hexadecimales. 

Vamos a verlo. Abre cualquier editor de código y añade lo siguiente:

main.py

import turtle as t

pantalla = t.Screen()
pantalla.setup(400, 400)
pantalla.bgcolor("white")

Date cuenta como hemos usado el nombre del color "white" (blanco) como color de fondo del lienzo.

Turtle tiene una lista de colores predefinidos que puedes usar, pero algunas veces querrás usar tus propios colores. Turtle también permite usar códigos de colores hexadecimales.

Por ejemplo, prueba a abrir la dirección de internet:

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Colors/Color_picker_tool

y escoge un color que te guste. Encuentra el valor hexadecimal de ese color que comenzará con este símbolo #, como por ejemplo #BADA55.

Copia el código hexadecimal incluyendo la "#" almohadilla y luego pegalo en el código para reemplazar la color "white".

El código quedaría de la siguiente forma:

main.py

import turtle as t

pantalla = t.Screen()
pantalla.setup(400, 400)
pantalla.bgcolor("#BADA35")

Vamos a escoger otro color hexadecimal y lo vamos a utilizar para crear un texto con ese color.

main.py

import turtle as t

pantalla = t.Screen()
pantalla.setup(400, 400)
pantalla.bgcolor("#BADA35")

t.color("#190d73")
estilo = ("Arial", 40, "bold")
t.write("HOLA", font = estilo, align = "center")
t.hideturtle()
Si ejecutas el código verás algo como esto.


uso del módulo turtle


No tienes porque usar la fuente "Arial", puedes probar con otras como "Verdana", "Times" o "Courier".

Prueba diferentes colores hasta que encuentres dos que te gusten y queden muy bien juntos.


Usando un diccionario para los colores.


Usar códigos hexadecimales para elegir los colores es una técnica muy flexible, pero es dificil para nosotros de recordar. Intentar recordar el código hexadecimal de un color que te guste y verás. 

Es más fácil hacerlo de otro modo, usando diccionarios de Python, asi no necesitarás recordar los códigos de los colores. Por ejemplo, yo he elegido dos colores:

main.py

#...
colores = {
    'rojomolon': '#df2707',
    'miazulete': '#7ebcc9',
    }

print(colores['rojomolon'])
print(colores['miazulete'])
Las claves del diccionario van dentro de los corchetes y los valores después de los dos puntos.

Ahora podemos adaptar el código para usar el diccionario de los colores.

Prueba el código para ver si todo se muestra correctamente.


colores en módulo turtle


Desafío: más colores.


Vamos a practicar más con el módulo de Turtle, repasando conceptos a la vez que usamos más colores.

main.py

import turtle as t

colores = {
    'rojomolon': '#df2707',
    'miazulete': '#7ebcc9',
    'fondo': '#A12BF5',
    'letrilla': '#E7F525',
    }

pantalla = t.Screen()
pantalla.setup(400, 400)
pantalla.bgcolor(colores['fondo'])

t.color(colores['rojomolon'])
estilo = ("Arial", 40, "bold")
t.write("HOLA", font = estilo, align = "center")

t.penup()
t.goto(0,100)
t.color(colores['letrilla'])
t.write("MUNDO", font = estilo, align = "center")

t.hideturtle()


escribiendo texto con el módulo turtle


Nuevo Desafio: ¡Creemos un Poster!


Los diseñadores a menudo crean una "paleta" de colores que funcionan bien juntos para un tema particular.

Puedes crear un nuevo proyecto de Python que utilice un diccionario para una paleta de colores temática. Podrías elegir otoño, bosque, mar, Navidad, helado, los colores de tu equipo deportivo favorito o una idea propia.

Crea un póster utilizando tu diccionario de paleta de colores.

También puedes usar otros comandos de turtle que conozcas, como forward, right, left, penup y pendown.

Quizás podrías agregar un borde a tu póster.

Otros comandos útiles de turtle:

circle(50) dibuja un contorno de círculo con un radio de 50.
dot(100) dibuja un círculo relleno con un diámetro de 100.

Aquí tienes un ejemplo:


poster completo usando turtle


Puedes encontrar el código de este post en este enlace de Github

sábado, 19 de marzo de 2022

Lista de widgets en tkinter y guizero.


Imagen introductoria: widgets




Lista de Widgets en Tkinter y Guizero.


En este capítulo vamos a repasar algunos de los elementos más importantes que podemos encontrar en una aplicación Gráfica (GUI) y una descripción sencilla del código para generarlo tanto en Tkinter como en Guizero.

Ejemplos de código para los widgets de tkinter.
Ejemplos de código para los widgets de Guizero.

¿Que es un widget? 


Un widget describe cada una de las diferentes partes que pueden ser usadas para crear una interfaz de usuario o GUI
Aunque no te suenen sus nombre, reconocerás muchos de ellos en los diferentes programas o websites que utilizas.

El siguiente ejemplo muestra siete widgets en Guizero. Aunque sus nombres en Tkinter pueden variar un poco básicamente son los mismos, ya que recuerda que Guizero usa Tkinter para funcionar. 


diferentes widgets


Vamos a ir viéndolos uno a uno junto una pequeña descripción de su uso. Luego haremos un pequeño ejemplo con ambos programas para ver como programarlos. En otros capítulos veremos las diferentes propiedades y métodos que pueden tener cada uno y entraremos más en detalle.

Tipos de Widgets.

_______________________________________________________________________________
 
Nombre en Tkinter Nombre en Guizero
Frame Box

Es un widget que actúa como contenedor para otros widgets. Es invisible por defecto y puede ser usado para colocar más fácilmente otros widgets dentro de la ventana y alterar su diseño. En el ejemplo crearemos una caja (llámale Frame o Box) y colocamos dos botones dentro.

Tkinter
demostración de frame


from tkinter import *
# Creamos la aplicacion principal y su tamaño
raiz = Tk()
raiz.geometry("200x150")

# Creamos una caja alineada a la izquierda que ocupe toda la ventana y con borde
# para que podamos verlo.
frame=Frame(raiz)
frame.config(bg="lightblue")
frame.pack(side="left", fill="x", expand=1)

# Colocamos un boton dentro del Frame
button=Button(frame,text="botón")
button.pack()
# Colocamos otro boton dentro del mismo Frame
button1= Button(frame, text="Otro botón")
button1.pack()

raiz.mainloop()

Guizero

demostración de widget frame


# importamos la ventana principal, una caja y un botón
from guizero import App, Box, PushButton
# Creamos la aplicación principal
app = App(width=200, height=150)

# Creamos una caja alineada a la izquierda que ocupe toda la ventana y con borde
# para que podamos verlo.
box = Box(app, align="left", width="fill", border=2)
# Colocamos un botón
button = PushButton(box)
# Colocamos otro que se pone debajo
button1 = PushButton(box, text="another button")

app.display()
_______________________________________________________

Nombre en TkinterNombre en Guizero
ButtonPushButton

Es un botón que se puede pulsar y que sirve para una multitud de propósitos. Es uno de los que más frecuentemente se utiliza. Una vez que se pulsa lanza alguna acción en el programa. 

Tkinter

widget button en tkinter


from tkinter import *
 
def set():
    print("Hola Mundo")
 
root = Tk()
root.geometry("200x150")
 
frame = Frame(root)
frame.pack()
button = Button(frame, text = "Botón1", command = set,
                fg = "red", font = "Verdana 14 underline",
                bd = 2, bg = "light blue", relief = "groove")
button.pack(pady = 5)
 
root.mainloop()
Guizero

button widget en guizero



# importamos la ventana principal, una caja y un botón
from guizero import App, Box, PushButton

def set():
    print("Hola Mundo")
    
# Creamos la aplicación principal
app = App(width=200, height=150)

# Creamos una caja alineada a la izquierda que ocupe toda la ventana y con borde
# para que podamos verlo.
box = Box(app)
# Colocamos el botón con una serie de propiedades iniciales
button = PushButton(box, text="Botón1", command=set)
# Propiedades adicionales de los botones
button.bg="light blue"
button.text_color="red"
# incluso podemos usar directamente un método de tkinter en guizero
# <nombre>.tk.config()
button.tk.config(bd=2, relief = "groove",font = "Verdana 14 underline")
button.tk.pack(pady=5)
_______________________________________________________

Nombre en TkinterNombre en Guizero
EntryTextBox

Se usa para que el usuario pueda introducir datos desde la aplicación. Es una caja de texto en donde el usuario puede introducir datos.

Tkinter




from tkinter import *
 
root = Tk()
root.geometry("200x150")
 
frame = Frame(root)
frame.pack()
 
my_entry = Entry(frame, width = 20)
my_entry.insert(0,'Username')
my_entry.pack(padx = 5, pady = 5)
 
my_entry2 = Entry(frame, width = 15)
my_entry2.insert(0,'password')
my_entry2.pack(padx = 5, pady = 5)
 
root.mainloop()

Guizero



from guizero import App, TextBox, Box
raiz = App(width=200, height=150)

# no existen paddings para los box en guizero
# para lograr lo mismo hay que usar tkinter o como en
# este caso meter algo por medio.

# Caja de relleno que no se ve pero esta ahí
Box(raiz, align="top", width="fill", height=5)
# Caja Principal que contiene los inputs.
box = Box(raiz)

inputA = TextBox(box, width=20,text="Username")
inputB = TextBox(box, width=15, text="Password")
raiz.display()

_______________________________________________________

Nombre en TkinterNombre en Guizero
Check Button 
CheckBox

Las casillas de verificación permiten al usuario escoger entre un conjunto de acciones que ya están predefinidas. El usuario puede escoger más de una opción.


Tkinter

check button en tkinter


root = Tk()
root.geometry("200x150")
 
frame = Frame(root)
frame.pack()
 
Var1 = IntVar()
Var2 = IntVar()
 
ChkBttn = Checkbutton(frame, width = 15, text="Opción 1", variable = Var1)
ChkBttn.pack(padx = 5, pady = 5)
 
ChkBttn2 = Checkbutton(frame, width = 15, text="Opción2", variable = Var2)
ChkBttn2.pack(padx = 5, pady = 5)

root.mainloop()

Guizero

checkbox en guizero


from guizero import App, CheckBox, Box

# Creamos la aplicación principal
app = App(width=200, height=150)

# Creamos una contenedor
box = Box(app)
# Incorporamos las casillas de verificación.
checkbox_1 = CheckBox(box, text="Opción1")
checkbox_1 = CheckBox(box, text="Opción2")

app.display()

______________________________________________________

Nombre en TkinterNombre en Guizero
Radio Button 
ButtonGroup

Se muestra un conjunto de casillas de verificación redondas, en donde el usuario puede escoger una única opción.

Tkinter

Radio Button en tkinter


from tkinter import *
 
root = Tk()
root.geometry("200x150")
frame = Frame(root)
frame.pack()
 
Var1 = StringVar()
 
RBttn = Radiobutton(frame, text = "Option1", variable = Var1,
                    value = 1)
RBttn.pack(padx = 5, pady = 5)
 
RBttn2 = Radiobutton(frame, text = "Option2", variable = Var1,
                     value = 2)
RBttn2.pack(padx = 5, pady = 5)
 
root.mainloop()

Guizero.

En el ejemplo usamos un ButtonGroup que muestra la selección en una caja de texto.

ButtonGroup en guizero


from guizero import App, ButtonGroup, Text, Box

def update_text():
    seleccionada.value = opciones.value

app = App(width=200, height=150)
opciones = ButtonGroup(app, options=
                              ["Opción 1",
                              "Opción 2"],
                            selected="Opción 1", command=update_text)

caja = Box(app, border=2)
seleccionada = Text(caja, "Opción 1")
app.display()

______________________________________________________

Nombre en TkinterNombre en Guizero
LabelText, Picture

Muestra un texto dentro de la aplicación que el usuario no puede modificar. Es bastante útil para poner títulos, etiquetas o instrucciones. Es muy versátil y lo podemos usar incluso para incluir imágenes.

Tkinter.

Label en tkinter



from tkinter import *
 
root = Tk()
root.geometry("200x150")
 
frame = Frame(root)
frame.pack()
 
var = StringVar()
var.set("Hola Mundo")
 
label = Label(frame, textvariable = var )
label.pack()
 
root.mainloop()

Guizero.

text en guizero


from guizero import App, Text

app = App(width=200, height=150)

texto = Text(app, text="Hola Mundo!")

app.display()
* Usamos el widget Picture si en vez de mostrar un texto queremos que se incluya una imagen.

_____________________________________________________


Nombre en TkinterNombre en Guizero
MenuMenuBar

Este wigdet muestra un menú en la parte superior de la pantalla, y cada opción del menú conduce a un submenú.

Tkinter

Menu en Tkinter


from tkinter import *
 
def save():
    #Código a ser escrito
    pass
 
def load():
    #Código a ser escrito
    pass   
 
root = Tk()
root.geometry("200x150")
frame = Frame(root)
frame.pack()
 
mainmenu = Menu(frame)
mainmenu.add_command(label = "Save", command= save)  
mainmenu.add_command(label = "Load", command= load)
mainmenu.add_command(label = "Exit", command= root.destroy)
 
root.config(menu = mainmenu)
 
root.mainloop()
Guizero.

MenuBar en guizero


from guizero import App, MenuBar
def file_function():
    pass #codigo a rellenar

def edit_function():
    pass #codigo a rellenar
    
def exit_function():
    app.destroy()

app = App(width=200, height=150)
menubar = MenuBar(app,
                  toplevel=["Save", "Load", "Exit"],
                  options=[
                      [ ["Guardar", file_function], ["Guardar como..", file_function] ],
                      [ ["Cargar", edit_function], ["Cargar archivo", edit_function] ],
                      [ ["Salir", exit_function]],
                  ])
app.display()

_______________________________________________________

Nombre en TkinterNombre en Guizero
ComboBoxCombo

Este objeto lo que hace es mostrar un cuadro desplegable que permite seleccionar una sola opción dentro de una lista de opciones.

Tkinter.

Combobox de tkinter



from tkinter import *
from tkinter import ttk
 
root = Tk()
root.geometry("200x150")
 
frame = Frame(root)
frame.pack()
 
vlist = ["Option1", "Option2", "Option3",
          "Option4", "Option5"]
 
Combo = ttk.Combobox(frame, values = vlist)
Combo.set("Escoge una opción")
Combo.pack(padx = 5, pady = 5)
 
root.mainloop()

Guizero.

Combo en guizero


from guizero import App, Combo
app = App(width=200, height=150)
combo = Combo(app, options=["Opción 1", "Opción 2", "Opción 3"])
app.display()

_______________________________________________________

Nombre en TkinterNombre en Guizero
List Box
ListBox

Se utiliza para mostrar una lista de opciones al usuario en donde elegir. Se puede escoger una o varias de ellas.

Tkinter.

List box en tkinter


from tkinter import *
root = Tk()
root.geometry("200x220")
frame = Frame(root)
frame.pack()
 
label = Label(root,text = "Escoge elementos a comprar.")  
label.pack()  
   
listbox = Listbox(root)  
   
listbox.insert(1,"Pan")  
listbox.insert(2, "Leche")  
listbox.insert(3, "Carne")  
listbox.insert(4, "Queso")
listbox.insert(5, "Verduras")  
   
listbox.pack()  
root.mainloop()

Guizero.

ListBox en guizero

from guizero import App, ListBox, Text
app = App(width=200, height=150)
Text(app, text="lista de la compra")
listbox = ListBox(app, items=["Pan", "Leche", "Carne", "Queso"])
app.display()

______________________________________________________

Nombre en TkinterNombre en Guizero
Menu Button-


Es una combinación entre el widget de menú y el de botón. Muestra un menú desplegable con una lista de opciones cuando hacemos click en él. Este widget es único porque puede incorporar aspectos de botones de opción y de opciones de verificación.

Tkinter

Menu Button en tkinter


from tkinter import *
 
root = Tk()
root.geometry("200x150")
frame = Frame(root)
frame.pack()
 
MenuBttn = Menubutton(frame, text = "Favourite food", relief = RAISED)
 
Var1 = IntVar()
Var2 = IntVar()
Var3 = IntVar()
 
Menu1 = Menu(MenuBttn, tearoff = 0)
 
Menu1.add_checkbutton(label = "Pizza", variable = Var1)
Menu1.add_checkbutton(label = "Cheese Burger", variable = Var2)
Menu1.add_checkbutton(label = "Salad", variable = Var3)
 
MenuBttn["menu"] = Menu1
 
MenuBttn.pack()
root.mainloop()

______________________________________________________

Nombre en TkinterNombre en Guizero
CanvasDrawing

Aunque no son exactamente igual en ambas librerías, nos permite dibujar formas, imágenes o texto. Es como una pizarra en la que puedes pintar o dibujar cualquier cosa.

Tkinter.

Canvas en Tkinter


from tkinter import *
 
root = Tk()
 
frame=Frame(root,width=300,height=300)
frame.pack(expand = True, fill=BOTH)
 
canvas = Canvas(frame,bg='white', width = 300,height = 300)
 
coordinates = 20, 50, 210, 230
arc = canvas.create_arc(coordinates, start=0, extent=250, fill="blue")
arc = canvas.create_arc(coordinates, start=250, extent=50, fill="red")
arc = canvas.create_arc(coordinates, start=300, extent=60, fill="yellow")
 
canvas.pack(expand = True, fill = BOTH)
 
root.mainloop()

Guizero.

Drawing in guizero


from guizero import App, Drawing
app = App(width=200, height=150)
drawing = Drawing(app)
drawing.rectangle(10, 10, 60, 60, color="blue")
app.display()
_______________________________________________________


Nombre en TkinterNombre en Guizero
ScalaSlider


Este objeto muestra una barra y un selector que puede usarse para especificar un valor en un rango.

Tkinter.

Scala en tkinter


from tkinter import * 
 
root = Tk()
root.geometry("200x200")
frame = Frame(root)
frame.pack()
 
Scala = Scale(frame, from_=0, to=10)
Scala.pack(padx=5, pady=5)
 
Scala2 = Scale(frame, from_=0, to=10, orient=HORIZONTAL)
Scala2.pack(padx=5, pady=5)
 
root.mainloop()

Guizero.



from guizero import App, Slider
app = App(width=200, height=150)
slider = Slider(app, horizontal=False)
slider = Slider(app)
app.display()
______________________________________________________


Nombre en TkinterNombre en Guizero
ScrollBar-

Este widget nos va a permitir el desplazarnos por un ventana de Tkinter o mejor dicho habilitar el desplazamiento para ciertos widgets. Por lo general se usa cuando tienes un espacio limitado para una ventana en Tkinter pero quieres más espacio para el widget. Veámoslo con un ejemplo.

ScrollBar in tkinker


root.geometry("200x250") 
    
mylabel = Label(root, text ='Scrollbars', font = "30")  
mylabel.pack() 
 
myscroll = Scrollbar(root) 
myscroll.pack(side = RIGHT, fill = Y) 
 
mylist = Listbox(root, yscrollcommand = myscroll.set )  
for line in range(1, 100): 
    mylist.insert(END, "Number " + str(line)) 
mylist.pack(side = LEFT, fill = BOTH )    
 
myscroll.config(command = mylist.yview) 
    
root.mainloop() 

_______________________________________________________

Nombre en TkinterNombre en Guizero
ToplevelWindow

Este widget nos va a permitir nuevas ventanas.

Tkinter.



from tkinter import *
 
def NuevaVentana():
    window = Toplevel()
    window.geometry('150x150')
    newlabel = Label(window, text = "Settings Window")
    newlabel.pack()
 
 
root = Tk()
root.geometry('200x200')
 
myframe = Frame(root)
myframe.pack()
 
mybutton = Button(myframe, text = "Settings", command = NuevaVentana)
mybutton.pack(pady = 10)
 
root.mainloop()

Guizero.

window in guizero


from guizero import App, Window, PushButton

def open_window():
    window.show(wait=True)

app = App(title="My app", height=200, width=200)

window = Window(app, title = "2nd ventana", height=150, width=150)
# La ventana esta creada pero la ocultamos para que no se vea
# hasta que se pulse el botón que la vuelva visible.
window.hide()

open=PushButton(app, text="Segunda ventana", command=open_window)

app.display()

_______________________________________________________

Nombre en TkinterNombre en Guizero
Notebook


Este Widget nos permite seleccionar páginas de contenido haciendo clic en las pestañas.

Tkinter.



Cuando se hace clic en alguna de estas pestañas, el widget Notebook mostrará un panel secundario asociado a la pestaña seleccionada. Normalmente este panel secundario mostrado es un widget Frame de tkinter. 

Para crear este widget, usamos la clase ttk.Notebook de la siguiente forma:

notebook = ttk.Notebook(contenedor, opciones**)
Por lo general el contenedor suele ser la raíz del proyecto.

Este contenedor tiene algunas opciones útiles. Por ejemplo se puede especificar las opciones height and width para especificar el alto y ancho en pixeles asociados al widget.

Además también podemos agregar algo de espacio alrededor del widget usando la opción "padding".


Métodos del Notebook.


La clase ttk.Notebook tiene varios métodos que permiten gestionar las ventanas de una manera efectiva.

Veamos los más utilizados: 

add(child, Kwargs**)

El método add agrega un widget secundario a una ventana. Se le puede pasar una o más opciones.

child es el widget para agregar al Notebook o cuaderno.

La opción "text" especifica la etiqueta que aparecerá en la ventana. 

La opción "image" especifica la imagen que se mostrará en la pestaña.

Si usamos ambas tenemos que describir la posición de la imagen en relación al texto. Puede ser:
tk.TOP , tk.BOTTOM, tk.LEFT, tk.RIGHT o tk.CENTER.

La opción "underline" toma como valores 0 o un número positivo. Esto subraya el caracter que le indiquemos, pero solo uno. Si ponemos underline=0, solo subrayará el primer carácter, si ponemos 1 subrayará el segundo y así sucesivamente.

hide(tabId) 

Este método oculta temporalmente la pestaña identificada por el tabId del Notebook. Como siempre la primera pestaña es la 0, la siguiente la 1 y así sucesivamente.

Para volver a mostrar la ventana hay que volver a utilizar el método add() ya que en este caso no hay un método show()

forget(child)

Elimina permanentemente el widget indicado del Notebook.

El siguiente programa muestra como crear un Notebook con dos pestañas:

import tkinter as tk
from tkinter import ttk

# root window
root = tk.Tk()
root.geometry('400x300')
root.title('Ejemplo de Widget Notebook')

# create a notebook
notebook = ttk.Notebook(root)
notebook.pack(pady=10, expand=True)

# create frames
frame1 = ttk.Frame(notebook, width=400, height=280)
frame2 = ttk.Frame(notebook, width=400, height=280)

frame1.pack(fill='both', expand=True)
frame2.pack(fill='both', expand=True)

# add frames to notebook

notebook.add(frame1, text='Pestaña A', underline=1)
notebook.add(frame2, text='Pestaña B')


root.mainloop()

Guizero.

No existe un elemento especifico para crear un Notebook en guizero asi que tenemos que usar el elemento ttk.Notebook de tkinter.

from guizero import App, Box
from tkinter import ttk
from tkinter.ttk import Notebook

# set up app to use grid layout
app = App(title="Uso de ttk Notebook", layout="grid")

# set up box to use grid and place it in app at 0,0
box = Box(app, border=True, layout='grid', grid=[0,0])

# create a notebook
nb = Notebook(box.tk)

# create some frames for the tabs
pestana_a = ttk.Frame(nb)
pestana_b = ttk.Frame(nb)

# add the tabs
nb.add(pestana_a, text='Pestaña A')
nb.add(pestana_b, text='Pestaña B')

# important - add tk widget only after it is completed
box.add_tk_widget(nb, grid=[0,0])


app.display()
Puedes ver como usar esta forma de utilizar elementos de tk en Guizero en este enlace a la página del manual de Guizero.