Python Tkinter 複数ウィンドウのチュートリアル

1. 説明

         この Python Tkinter チュートリアルでは、Python Tkinterで複数のウィンドウを作成する方法を学び 、また、複数のウィンドウに関連するさまざまな例についても説明します。そして、それらのトピックについても説明します。
  • Python Tkinter の複数のウィンドウ
  • 複数のウィンドウでの Python Tkinter ユーザー登録
  • Python Tkinter のマルチページ アクセスの検証

目次

2. マルチウィンドウの問題

まず、 Python Tkinter を使用して複数のウィンドウを作成する        方法を学びます

        私たちは複数のウィンドウがどのように機能するかを学んでいます。複数のウィンドウとは、あるページを、相互にリンクされている他のページと接続し、新しいタブで開いたり、新しいページにリダイレクトしたりすることを意味します。

        コード:

import tkinter as tk

def New_Window():
    Window = tk.Toplevel()
    canvas = tk.Canvas(Window, height=HEIGHT, width=WIDTH)
    canvas.pack()
    
HEIGHT = 300
WIDTH = 500

ws = tk.Tk()
ws.title("Python Guides")
canvas = tk.Canvas(ws, height=HEIGHT, width=WIDTH)
canvas.pack()

button = tk.Button(ws, text="Click ME", bg='White', fg='Black',
                              command=lambda: New_Window())

button.pack()
ws.mainloop()

        以下に、指定されたコードの重要なハイライトをいくつか示します。

  •  ルートウィンドウのWS
  • 高さ = キャンバス ウィジェットの高さ。
  • width  = キャンバスウィジェットの幅。
  • 背景色にはBGを使用します。
  •  前景色にはFGを使用します。
  • ツツツツButton() はボタンを追加するために使用されます。

        出力:

        上記のコードでは、画面の下部に簡単なボタンを作成しました。ボタンをクリックすると、新しいウィンドウが開きます。

Python Tkinter の複数ウィンドウ

        出力:

        上記の出力でわかるように、「Click Me」ボタンをクリックすると、新しいウィンドウが開きます。結果を以下に示します。

Python Tkinter マルチウィンドウの例

最終出力

 

3. マルチウィンドウを使用したPython Tkinterのユーザー登録

次のセクションでは、複数のウィンドウに登録された Python Tkinter ユーザー        を見ていきます。

        名前、電子メール、パスワードに関連する情報を含むブロック列を作成したレジストリを作成する必要があります。また、OTP 検証電子メールを使用して、実際のユーザーのデータベースが正常であるかどうかを確認します。

        コード:

        このコードで使用するライブラリには、smtplibsqlite3messageboxrandomEmailMessageTkinter 、およびemail.messageライブラリがあります。ここで使用されるラベル、フィールド、エントリ、ボタンもいくつかあります。

  •  データベース接続用のsqllite3.connect()
  • Label() は、このユーザーにテキストを表示するために使用されますが、対話型ではありません。
  • Entry() は、ユーザーからの値を受け入れる単一行のテキストボックスです。
from tkinter import *
import re
from tkinter import messagebox
import sqlite3
import random
from email.message import EmailMessage
import smtplib


<strong># Database</strong> 
try:
    con = sqlite3.connect('website.db')

    con.execute('''create table if not exists users(
                fname text not null,
                lname text not null,
                email text not null,
                password text not null);      
    ''')
    con.close()

except Exception as ep:
    messagebox.showerror('', ep)
 
 
ws = Tk()
ws.title('Python Guides')
ws.geometry('500x400')
ws.config(bg="#447c84")
ws.attributes('-fullscreen',True)

<strong># functions</strong>

def otp_gen():
    pass

cpy = ''

def sendOtp():
    otp_no = ''
    for _ in range(4):
        r = random.randint(0, 9)
        otp_no += str(r)  
    
    global cpy 
    cpy += otp_no
    sender = "[email protected]"
    reciever = em.get()
    password = "Cute...pie@0823"
    msg_body = f'otp is {cpy}'
    msg = EmailMessage()
    msg['subject'] = 'OTP'   
    msg['from'] = sender
    msg['to'] = reciever
    msg.set_content(msg_body)
    with smtplib.SMTP_SSL('smtp.gmail.com', 465) as smtp:
        smtp.login(sender,password)
        
        smtp.send_message(msg)
    
    print(cpy)
    return cpy

def clr():
    fname.delete(0, END)
    lname.delete(0, END)
    em.delete(0, END)
    pwd.delete(0, END)


def submit():
    enteredOtp = otp.get()
    expectedOtp = cpy
    print(expectedOtp)

    fname_check = fname.get()
    lname_check = lname.get()
    em_check = em.get()
    pwd_check = pwd.get()
    otp_check = otp.get()
    check_count = 0

    if fname_check == "":
        warn = "First name can't be empty!"
    else:
        check_count += 1
    if lname_check == "":
        warn = "Last name can't be empty!"
    else:
        check_count += 1
    if em_check == "":
        warn = "Email can't be empty!"
    else:
        check_count += 1
    if pwd_check == "":
        warn = "Password can't be empty!"
    else:
        check_count += 1
    if otp_check == "":
        warn = "Otp can't be empty!"
    else:
        check_count += 1

    # if fname_check, lname_check, pwd_check, otp_check:
    if check_count == 5:
        if (expectedOtp == enteredOtp):
            con = sqlite3.connect('website.db')
            c = con.cursor()
            c.execute("insert into users VALUES (:fname, :lname, :em, :pwd)",{

                'fname': fname.get(),
                'lname': lname.get(),
                'em': em.get(),
                'pwd': pwd.get()
            })
            con.commit()
            
            ws.destroy()
            import app

        else:
            messagebox.showerror('','Incorrect Otp')
    else:
        messagebox.showerror('', warn)

<strong># frames</strong>
frame = Frame(ws, padx=20, pady=20)
frame.pack(expand=True)

<strong># labels</strong>
Label(
    frame, 
    text="Create New Account",
    font=("Times", "24", "bold")
    ).grid(row=0, columnspan=3, pady=10)

Label(
    frame, 
    text='First Name', 
    font=("Times", "14")
    ).grid(row=1, column=0, pady=5)

Label(
    frame, 
    text='Last Name', 
    font=("Times", "14")
    ).grid(row=2, column=0, pady=5)

Label(
    frame, 
    text='Email Address', 
    font=("Times", "14")
    ).grid(row=3, column=0, pady=5)

Label(
    frame, 
    text='Password', 
    font=("Times", "14")
    ).grid(row=4, column=0, pady=5)

Label(
    frame, 
    text='Enter OTP', 
    font=("Times", "14")
    ).grid(row=5, column=0, pady=5)


<strong># Entry</strong>
fname = Entry(frame, width=30)
lname = Entry(frame, width=30)
em = Entry(frame, width=30)
pwd = Entry(frame, width=30)
otp = Entry(frame, width=30)


fname.grid(row=1, column=1)
lname.grid(row=2, column=1)
em.grid(row=3, column=1)
pwd.grid(row=4, column=1)
otp.grid(row=5, column=1)

<strong># button </strong>
clr = Button(frame, text="Clear", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=clr)
reg = Button(frame, text="Register", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=submit)
ext = Button(frame, text="Exit", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=lambda:ws.destroy())
otpp = Button(frame, text="verify email", padx=10, relief=RAISED, font=("Times", "10", "bold"), command=sendOtp)
clr.grid(row=6, column=0, pady=20)
reg.grid(row=6, column=1, pady=20)
ext.grid(row=6, column=2, pady=20)
otpp.grid(row=5, column=2)

ws.mainloop()

        出力:

上記のコードでは、ラベル、ボタンエントリなどの詳細を        含む登録フォームを作成しました。このコードは、ここに登録する実際のユーザーを追加するデータベース接続に接続されています。

Python tkinter レジスタ複数ウィンドウ

        新しいアカウントの出力

        以下の出力では、すべての詳細を入力し、さらなるアクションのために電子メールを確認します。

複数のウィンドウでの Python Tkinter ユーザー登録

        複数のウィンドウでの Python Tkinter ユーザー登録

OTP を確認してランダムに入力すると、「 OTP が正しくありません」        というメッセージとともにエラーが表示されることがわかりますこれは、登録に使用した正しい OTP と電子メール アドレスを提供するまで、先に進むことができないことを意味します。

Python tkinter の複数のウィンドウ

        Python tkinter の複数のウィンドウ

         

4. Python Tkinter のマルチページ アクセスの検証

        次のセクションでは、複数ページのアクセス検証について見ていきます。

        アクセス認証とは、登録時に登録されたユーザーのパスワードと電子メールを認証することを意味します。このコードのアカウント作成ボタンを使用してユーザーを登録することもできます。

        コード:

        ログインページ.py

        ここで、このコードで使用しているライブラリの一部が、   Tkinter ライブラリの sqlite3とmessageboxであることを見てみましょう。ここでは、ラベル、フィールド、エントリ、ボタンも使用されます。

  •  ユーザー名はun
  • パスワードのPD
  • messagebox.showerror() は、間違ったユーザー名とパスワードが入力されたときに使用され、自動的にエラーを表示します。
from tkinter import *
from tkinter import messagebox
import sqlite3



try:
        con = sqlite3.connect('website.db')
        c = con.cursor()
        c.execute("Select * from users")
        for i in c.fetchall():
            un = i[2]
            pd = i[3]
        
except Exception as ep:
    messagebox.showerror('', ep)

ws = Tk()
ws.title('Python Guides')
ws.geometry('500x400')
ws.config(bg="#447c84")
ws.attributes('-fullscreen',True)


def createAccount():
    ws.destroy()
    import register


def submit():
    u = uname.get()
    p = pwd.get()
    check_counter=0
    if u == "":
       warn = "Username can't be empty"
    else:
        check_counter += 1
    if p == "":
        warn = "Password can't be empty"
    else:
        check_counter += 1
    if check_counter == 2:
        if (u == un and p == pd):
            ws.destroy()
            import app
        
        else:
            messagebox.showerror('', 'invalid username or password')
    else:
        messagebox.showerror('', warn)
       
<strong># frame</strong>
frame = Frame(ws, padx=20, pady=20)
frame.pack_propagate(False)
frame.pack(expand=True)


<strong># labels</strong>
Label(
    frame, 
    text="Admin Login", 
    font=("Times", "24", "bold") 
    ).grid(row=0,  columnspan=3, pady=10) #..place(x=170, y=10)

Label(
    frame, 
    text='Enter Username', 
    font=("Times", "14")
    ).grid(row=1, column=1, pady=5) #.place(x=50, y=70)

Label(
    frame, 
    text='Enter Password', 
    font=("Times", "14")
    ).grid(row=2, column=1, pady=5) #.place(x=50, y=110)

<strong># Entry</strong>
uname = Entry(frame, width=20)
pwd = Entry(frame, width=20, show="*")
# uname.place(x=220, y=70)
# pwd.place(x=220, y=110)
uname.grid(row=1, column=2)
pwd.grid(row=2, column=2)

<strong># button</strong> 
reg = Button(
    frame, 
    text="Create Account", 
    padx=20, pady=10, 
    relief=RAISED, 
    font=("Times", "14", "bold"), 
    command=createAccount
    )

sub = Button(
    frame, 
    text="Login", 
    padx=20, 
    pady=10, 
    relief=RAISED, 
    font=("Times", "14", "bold"), 
    command=submit
    )

reg.grid(row=3, column=1, pady=10)
sub.grid(row=3, column=2, pady=10)

ws.mainloop()

出力:

上記のコードを実行すると、 「ユーザー名を入力」、  「パスワードを入力」  、およびさまざまな機能を実行している 2 つのボタンのラベルが表示される出力が得られました 。

Python tkinterログインマルチウィンドウ

        ログ出力

        以下の出力では、パスワード セクションのユーザー名とパスワードに電子メールを入力し、[ログイン] ボタンをクリックしています。

Python Tkinterログイン1

        ログインウィンドウ

        ご覧のとおり、ユーザー名とパスワードがユーザーによって誤って入力されており、別のウィンドウやページにリダイレクトされていないことがわかります。

Python tkinter ログイン例 1

        ログイン 2. 出力

        App.py

        以下は、検証プロセスの完了後に別のページを実行するコードです。

コード:

from tkinter import *
from tkinter import messagebox

ws = Tk()
ws.title('Python Guides')
ws.geometry('500x300')
ws.config(bg="#447c84")
ws.attributes('-fullscreen',True)

# functions
def msg():
    return messagebox.showinfo('', 'Life is short, \n do what you love')

def logOut():
   resp = messagebox.askquestion('', 'Are you sure?')
   if resp == 'yes':
        ws.destroy()
        
   else:
        pass

# frames
frame = Frame(
     ws,
     padx=20,
     pady=20
)
frame.pack(expand=True)

<strong># image </strong>
img = PhotoImage(file='img.png')

<strong># labelslo</strong>
Label(
     frame, 
     text="Congratulations!",
     font=("Times", "24", "bold")
     ).grid(row=0, columnspan=3)

Label(
     frame, 
     text='Your Account is Active', 
     fg='green',
     font=("Times", "14")
     ).grid(row=1, columnspan=3)

imglbl = Label(frame, image=img)
imglbl.grid(row=2, column=1)

<strong># button</strong> 
exp = Button(frame, text="open>>", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=msg)
logout = Button(frame, text="Logout", padx=20, pady=10, relief=SOLID, font=("Times", "14", "bold"), command=logOut)
exp.grid(row=2 , column=1)
logout.grid(row=3, column=1)

ws.mainloop()

次のコードを実行して「ログイン」ボタンをクリックした後、有効なユーザー名とパスワードを入力する必要があります。別のウィンドウにリダイレクトされ、次のメッセージが表示されます。

また、ページを終了するのに役立つログアウト ボタンも表示されます。

Python tkinter アプリのマルチウィンドウ

        出力

        次の Tkinter チュートリアルもお読みください。

おすすめ

転載: blog.csdn.net/gongdiwudu/article/details/132679520