1. 説明
- 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() はボタンを追加するために使用されます。
出力:
上記のコードでは、画面の下部に簡単なボタンを作成しました。ボタンをクリックすると、新しいウィンドウが開きます。
出力:
上記の出力でわかるように、「Click Me」ボタンをクリックすると、新しいウィンドウが開きます。結果を以下に示します。
最終出力
3. マルチウィンドウを使用したPython Tkinterのユーザー登録
次のセクションでは、複数のウィンドウに登録された Python Tkinter ユーザー を見ていきます。
名前、電子メール、パスワードに関連する情報を含むブロック列を作成したレジストリを作成する必要があります。また、OTP 検証電子メールを使用して、実際のユーザーのデータベースが正常であるかどうかを確認します。
コード:
このコードで使用するライブラリには、smtplib、sqlite3、messagebox、random、EmailMessage、Tkinter 、および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 ユーザー登録
OTP を確認してランダムに入力すると、「 OTP が正しくありません」 というメッセージとともにエラーが表示されることがわかります。これは、登録に使用した正しい OTP と電子メール アドレスを提供するまで、先に進むことができないことを意味します。
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 つのボタンのラベルが表示される出力が得られました 。
ログ出力
以下の出力では、パスワード セクションのユーザー名とパスワードに電子メールを入力し、[ログイン] ボタンをクリックしています。
ログインウィンドウ
ご覧のとおり、ユーザー名とパスワードがユーザーによって誤って入力されており、別のウィンドウやページにリダイレクトされていないことがわかります。
ログイン 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()
次のコードを実行して「ログイン」ボタンをクリックした後、有効なユーザー名とパスワードを入力する必要があります。別のウィンドウにリダイレクトされ、次のメッセージが表示されます。
また、ページを終了するのに役立つログアウト ボタンも表示されます。
出力
次の Tkinter チュートリアルもお読みください。