>  기사  >  백엔드 개발  >  Python Tkinter 튜토리얼 숫자 추측 게임

Python Tkinter 튜토리얼 숫자 추측 게임

coldplay.xixi
coldplay.xixi앞으로
2020-10-29 17:19:223402검색

python 비디오 튜토리얼 칼럼에서는 숫자 추측 게임과 함께 Tkinter를 소개합니다.

Python Tkinter 튜토리얼 숫자 추측 게임

Tkinter는 Python의 Tk GUI(그래픽 사용자 인터페이스) 툴킷과 사실상의 표준 GUI를 위한 표준 인터페이스입니다. GUI를 사용하면 창, 아이콘, 메뉴 등 대부분의 운영 체제에서 사용되는 시각적 항목을 사용하여 컴퓨터와 상호 작용할 수 있습니다. 이 강력한 도구는 다양한 프로젝트를 구축하는 데 사용할 수 있으며 코드 시각화를 더 쉽게 만듭니다.

이 기사에서는 Tkinter의 기본 사항과 Python 애플리케이션에서 사용할 수 있는 다양한 유형의 위젯에 대해 알아봅니다. 이 기사의 뒷부분에서 우리는 Tkinter 위젯을 사용하여 멋진 숫자 추측 게임을 개발할 것입니다.

오늘 다룰 내용은 다음과 같습니다.

  • Tkinter의 기본
  • Tkinter 위젯 및 예제
  • 숫자 추측 게임을 처음부터 만들기

Tkinter의 기본

게임을 만들기 전에 먼저 이해해야 합니다. Tkinter의 기본 몇 가지 기본 사항. Tkinter 패키지는 Tk GUI 툴킷에 대한 표준 Python 인터페이스입니다. 우리는 일반적으로 Tkinter 패키지를 사용하여 애플리케이션에 다양한 GUI 위젯을 삽입하여 애플리케이션을 보다 사용자 친화적으로 만듭니다. Linux, Windows 또는 Mac에서 Python을 사용하는 경우 Python Tkinter가 장치에 이미 설치되어 있습니다.

GUI 애플리케이션을 어떻게 개발하나요?

GUI 애플리케이션을 생성하는 기본 프로세스는 다음과 같습니다.

Tkinter 모듈 가져오기메인 창 만들기위젯 추가메인 루프 입력

Python을 사용하여 GUI 애플리케이션 개발과 관련된 단계:

  • tkinter 모듈을 가져옵니다.
  • GUI 애플리케이션용 기본 창을 만듭니다.
  • 이제 앱에 원하는 만큼 위젯을 추가하세요.
  • 주요 기능을 수행하려면 주 이벤트 루프에 들어가세요.

이제 간단한 tkinter 창을 만드는 방법을 살펴보겠습니다.

먼저 tkinter 모듈을 가져옵니다. 여기에는 애플리케이션을 구축하는 데 필요한 모든 기능, 클래스 및 기타 항목이 포함되어 있습니다. 이제 모듈을 가져올 때 tkinter를 초기화해야 합니다. 이를 위해 Tk( ) 루트 위젯을 만듭니다. 이제 위젯을 추가할 기본 GUI 창이 생성됩니다. 현재 메인 창에는 제목 표시줄만 있습니다. Tk( )根窗口小部件。现在,这将创建我们的主GUI窗口,我们将在其中添加小部件。此时,我们的主窗口只有标题栏。

我们应该只为我们的应用程序创建一个窗口,并且必须在添加任何其他小部件之前创建该窗口。之后,我们使用root.mainloop( )。除非输入,否则不会显示我们刚刚创建的主窗口mainloop

애플리케이션용 창은 하나만 생성해야 하며 다른 위젯을 추가하기 전에 이 창을 생성해야 합니다. 그 다음에는 root.mainloop( )를 사용합니다. 방금 생성한 mainloop 메인 창은 입력하지 않으면 표시되지 않습니다. 닫기 버튼을 누르면 프로그램이 메인 루프를 종료합니다. 닫기 버튼을 누를 때까지 애플리케이션이 실행됩니다.

간단한 tkinter 창을 생성하기 위한 코드:

#import required libraries
from tkinter import *

# initialize tkinter :
root = Tk()

# enter the main Loop :
root.mainloop()复制代码

Tkinter용 예제가 포함된 위젯
  • **버튼:**버튼 표시.
  • **캔버스:**도형을 그립니다.
  • **체크박스:**여러 옵션을 체크박스로 표시합니다.
  • **입력:** 사용자의 한 줄 입력을 허용합니다.
  • **프레임워크:**다른 위젯을 구성합니다.
  • ** 태그:** 다른 위젯에 제목을 추가합니다.
  • **목록 상자:** 사용자에게 옵션 목록을 제공합니다.
  • 메뉴 버튼: **애플리케이션에 메뉴를 표시합니다.
  • **메뉴:** 사용자에게 다양한 명령을 제공합니다.
  • **메시지:** 여러 줄의 텍스트 필드를 표시합니다.
  • **라디오 버튼:** 옵션 수를 라디오 버튼으로 표시합니다.
  • **스케일 바:**슬라이더를 사용할 수 있습니다.
  • **스크롤 막대:**스크롤 기능을 추가합니다.
  • **텍스트:** 텍스트를 여러 줄로 표시합니다.
  • **최상위 수준:** 별도의 창 컨테이너를 제공합니다.
  • **스핀박스:** 고정된 입력 값 중에서 선택하세요.
  • **PanedWindow:** 위젯을 가로 또는 세로로 정렬합니다.
  • **LabelFrame:** 복잡한 구조를 위한 공간을 제공합니다.
  • **tkMessageBox:** 애플리케이션에 메시지 상자를 표시합니다.

이제 In Out 애플리케이션에 필요한 위젯 몇 가지를 간략하게 소개하겠습니다. 여기서는 가장 간단한 예로 위젯을 시연하고 있다는 점을 명심하세요. 각 위젯에는 다양한 기능이 있습니다. 우리는 게임을 개발하면서 이들 중 일부를 보게 될 것입니다.

일부 Tkinter 위젯 예

버튼:

버튼 위젯은 애플리케이션에 버튼을 표시하는 데 사용됩니다. 일반적으로 버튼을 누르면 그에 관련된 명령이 나타납니다.

# Import required libraries :
from tkinter import *

# Initialize tkinter :
root = Tk()

# Adding widgets :

# Add button :
btn = Button(root,text="PRESS ME",command=lambda:press())
# Place button in window : 
btn.grid(row=0,column=0)

# Define the function :
def press()
  lbl = Label(root,text="You Pressed The Button")
  lbl.grid(row=0,column=1)

# Enter the main Loop : 
root.mainloop()复制代码
** 라벨: ** 라벨 위젯은 애플리케이션의 다른 위젯에 대해 한 줄 제목을 제공하는 데 사용됩니다.

# Import required libraries :
from tkinter import *

# Initialize tkinter :
root = Tk()

# Adding widgets :

# Add label :
lbl = Label(root,text="This is label")

# Place the button on window :
lbl.grid(row=0,column=1)

# Enter the main Loop :
root.mainloop()复制代码
**캔버스:**캔버스 위젯은 다양한 모양을 그리는 데 사용됩니다.

# Import required libraries :
from tkinter import *

# Initialize tkinter :
root = Tk()

# Adding widgets : 
# Add canvas : 
# Create canvas object : 
c = Canvas(root,bg="3389db",height=250,width-300)

# Draw a straight line :
line = c.create_line(0,0,50,50)

# To fit the line in the window
c.pack()

# Enter the main loop
root.mainloop()复制代码
**CheckButton:** 우리는 사용자가 사용할 수 있는 여러 옵션을 표시하기 위해 checkbutton을 사용합니다. 여기에서 사용자는 여러 옵션을 선택할 수 있습니다.

# Import required libraries :
from tkinter import *

# Initialize tkinter :
root = Tk()

# Adding widgets : 
# Add checkbutton : 

# IntVar() hold integers
# Default value is 0
# If checkbox is marked, this will change to 1
checkvar1 = IntVar()
checkvar2 = IntVar()

# Create checkbutton 
c1 = Checkbutton(root,text="BMW", variable=checkvar1)
c2 = Checkbutton(root,text="Audi",variable=checkbar2)

# To fit in the main window
c1.grid(row=0,column=0)
c2.grid(row=1,column=0)

# Enter the main Loop
root.mainloop()复制代码
Entry: Entry 위젯은 사용자의 한 줄 입력을 받아들이는 데 사용됩니다.

# Import required libraries 
from tkinter import *

# Initialize tkinter
root = Tk()

# Adding widgets 
# Label 
lbl = Label(root,text="Enter your name:")
lbl.grid(row=0,column=0)

# Entry 
e = Entry(root)
e.grid(row=0,column=1)

# Enter the main Loop
root.mainloop()复制代码
**프레임:**동일한 애플리케이션에서 다른 위젯을 구성하기 위한 컨테이너 위젯으로 사용됩니다.

# Import required libraries 
from tkinter import *

# Initialize tkinter
root = Tk()

# Adding widgets 

frame = Frame(root)
frame.pack()

# Add button on Left
A = Button(frame,text="A")
A.pack(side = LEFT)

# Add button on Right 
B = Button(frame,text="B")
B.pack(side = RIGHT)

# Enter the main Loop
root.mainloop()复制代码
**목록 상자:**사용자에게 옵션 목록을 제공하는 데 사용됩니다.

# Import required libraries 
from tkinter import *

# Initialize tkinter
root = Tk()

# Adding widgets 

# Create Listbox : 
Lb = Listbox(root)

# Add items in list
Lb.insert(1,"A")
Lb.insert(2,"B")
Lb.insert(3,"C")
Lb.insert(4,"D")

# Place listbox on window 
Lb.grid(row=0,column=0)

# Enter the main Loop
root.mainloop()复制代码
숫자 추측 게임을 처음부터 만들어보세요🎜

分步演练

当用户运行程序时,我们的代码将生成一个介于0到9之间的随机数。用户将不知道随机生成的数字。现在,用户必须猜测随机生成的数字的值。用户在输入框中输入值。之后,用户将按下检查按钮。该按钮将触发功能。该功能将检查用户输入的号码是否与随机生成的号码匹配。如果猜测的数字正确,则程序将显示正确的标签和实际数字(在这种情况下,该数字将与猜测的数字相同)。

现在,如果猜测的数字小于随机生成的数字,则我们的程序将显示TOO LOW标签,并且这还将清除输入框,以便用户可以输入新的数字。

如果猜中的数字高于实际数字,则我们的程序将显示TOO HIGH标签,并清除输入框。这样,用户可以继续猜测正确的数字。

如果标签显示TOO HIGH,则用户应该输入比他们猜想的数字低的数字。如果标签显示TOO LOW,则用户应该输入比他们第一次猜测的数字更大的数字。

我们的程序还将计算用户猜测正确数字所需的尝试次数。当用户最终做出正确的猜测时,它将显示总尝试次数。

如果用户想玩新游戏,则必须按下主关闭按钮。如果用户在我们的应用程序中按下“ **关闭”**按钮,则他们将完全退出游戏。

只需简单的步骤即可:

  • 运行应用程序。
  • 输入您的猜测。
  • 按下检查按钮。
  • 如果标签显示不正确,请猜测一个新数字。
  • 如果标签显示正确,则显示尝试次数。
  • 按下主关闭按钮以新号码重新开始游戏。
  • 从我们的应用程序中按下关闭按钮以完全退出游戏。

![Python Tkinter教程系列02:数字猜谜游戏插图(12)](https://img.php.cn/upload/article/000/000/052/a829e9a273177c9e7f7b0cf1d39a0ef6-0.jpg "Python Tkinter教程系列02:数字猜谜游戏插图(12)")我们将逐步向您展示如何使用Python tkinter构建上述游戏。

图片素材在这里IT小站,此处下载数字猜谜游戏素材

步骤1:导入所需的库

# import required libraies :

from tkinter import * # to add widgets
import random # to generate a random number
import tkinter.font as font # to change properties of font
import simpleaudio as sa # to play sound files复制代码

步骤2:建立主Tkinter视窗

want_to_play = True 

while want_to_play==True:

  root = Tk()
  root.title("Guess The Number!")
  root.geometry('+100+0')
  root.configure(bg="#000000")
  root.resizable(width=False,height=False)
  root.iconphoto(True,PhotoImage(file="surprise.png"))复制代码
  • 首先,我们创建一个名为的变量want_to_play,并将其值设置为True。当变量设置为时,我们的程序将生成一个新窗口True。当用户按下主关闭按钮时,它将退出循环,但是在这里,我们将变量设置为True,因此它将使用新生成的数字创建另一个窗口。
  • root = Tk( ):用于初始化我们的tkinter模块。
  • root.title( ):我们使用它来设置应用程序的标题。
  • root.geometry( ):我们使用它来指定我们的应用程序窗口将在哪个位置打开。
  • root.configure( ):我们使用它来指定应用程序的背景色。
  • root.resizable( ):在这里我们使用它来防止用户调整主窗口的大小。
  • root.iconphoto( ):我们使用它来设置应用程序窗口标题栏中的图标。我们将第一个参数设置为True

步骤3:导入声音文件

# to play sound files 
start = sa.WaveObject.from_wave_file("Start.wav")
one = sa.WaveObject.from_wave_file("Win.wav")
two = sa.WaveObjet.from_wave_file("Lose.wav")
three = sa.WaveObject.from_wave_file("Draw.wav")

start.play()复制代码

现在,我们将使用一些将在各种事件中播放的声音文件。当我们的程序启动时,它将播放开始文件。当用户的猜测正确,用户的猜测错误以及用户关闭应用程序时,我们将分别播放其余三个文件。需要注意的一件事是它仅接受.wav文件。首先,我们需要将声音文件加载到对象中。然后我们可以.play( )在需要时使用方法播放它。

步骤4:为我们的应用程序加载图像

我们将在应用程序中使用各种图像。要首先使用这些图像,我们需要加载这些图像。在这里,我们将使用PhotoImage类加载图像。

# Loading images
Check = PhotoImage(file="Check_5.png")
High = PhotoImage(file="High_5.png")
Low = PhotoImage(file="Low_5.png")
Correct = PhotoImage(file="Correct_5.png")
Surprise = PhotoImage(file="Surprise.png")
your_choice = PhotoImage(file="YOUR_GUESS.png")
fingers = PhotoImage(file="fingers.png")
close = PhotoImage(file="Close_5.png")复制代码

步骤5:产生随机数

在这里,我们将生成1–9之间的随机数。我们将使用随机模块生成1–9之间的随机整数。

# generating random number
number = random.randint(1,9)复制代码

步骤6:修改字体

在这里,我们将使用字体模块来更改应用程序中的字体。

# using font module to modify fonts
myFont = font.Font(family='Helvetica',weight='bold')复制代码

步骤7:添加小部件

在这里,我们添加了应用程序的前两个小部件。请注意,输入框位于第2行,因为我们在第1行中添加了空格。在这里,我们将在标签中使用图像文件。我们用于.grid( )指定特定小部件的位置。

# Creating first label
label = Label(root,image=your_choice)
label.grid(row=0,column=1)

# Creating the entry box 
e1 = Entry(root,bd=5,width=13,bg="9ca1db",justify=CENTER,font=myFont)
e1.grid(row=2,column=1)复制代码

步骤8:添加其他小部件

在这里,我们将添加其他一些小部件,例如按钮和标签。将有两个按钮,一个用于检查值,另一个用于永久关闭窗口。第二个标签将显示用户猜测的值是正确还是高还是低。它将相应地显示标签。如果用户的猜测正确,第三个标签将显示正确的数字。

第四个标签显示用户猜测正确值所花费的尝试总数。在这里请注意,这两个按钮将触发命令。在接下来的几点中,我们将对此进行研究。

# Creating check button :
b1 = Button(root,image=Check,command=lambda:show())
b1.grid(row=4,column=3)

# Creating close button :
b2 = Button(root,image=close,command=lambda:reset())

#Creaating second label :
label2 = Label(root,image=fingers)
label2.grid(row=6,column=1)

#Creating third label :
label3 = Label(root,image=Surprise)
label3.grid(row=10,column=1)

#Creating fourth label :
label4= Label(root,text="ATTEMPTS : ",bd=5,width=13,bg="#34e0f2",justify=CENTER,font=myFont)
label4.grid(row=12,column=1)复制代码

步骤9:显示正确的图像并将计数器设置为尝试值

当用户的猜测正确时,我们将在此处显示正确的数字图像。我们的数字存储方式如下:

  • 1.png
  • 2.png
  • 3.png
  • 100.png

因此,我们的程序将采用实际的数字,并在其中添加.png字符串并打开该文件。我们还将设置计数器以计算尝试值。它将存储尝试猜测正确数字所需的尝试次数值。

# to display the correct image
num = PhotoImage(file = str(number)+str(".png"))

# Set the count to 0
count = 0复制代码

步骤10:当我们按下检查按钮时将触发的功能

在这里,每当用户按下检查按钮时,尝试次数的计数值将增加一。然后,我们将用户输入的值存储在名为answer的变量中。然后,我们将检查用户是否尚未输入任何值,并按下检查按钮,它将转到reset()功能,应用程序将关闭。

现在,我们必须将用户输入的值转换为整数,以便将其与实际数字进行比较。

def show():

    #Increase the count value as the user presses check button.
    global count
    count = count+1

    #Get the value entered by user.
    answer = e1.get()

    #If the entry value is null the goto reset() function.
    if answer=="":
        reset()

    #Convert it to int for comparision.
    answer = int(e1.get())

    if answer > number:
            #Play sound file.
            two.play()
            #Change the label to Too High.
            label2.configure(image=High)
            #Calls all pending idle tasks.
            root.update_idletasks()
            #Wait for 1 second.
            root.after(1000)
            #Clear the entry.
            e1.delete(0,"end")
            #Change the label to the original value.
            label2.configure(image=fingers)

        elif answer < number:
            #Play sound file.
            two.play()
            #Change the label to Too Low.
            label2.configure(image=Low)
            #Calls all pending idle tasks.
            root.update_idletasks()
            #Wait for 1 second.
            root.after(1000)
            #Clear the entry.
            e1.delete(0,"end")
            #Change the label to the original value.
            label2.configure(image=fingers)

        else:
            #Play sound file.
            one.play()
            #Show the CORRECT image.
            label2.configure(image=Correct)
            #Show the correct number.
            label3.configure(image=num)
            #Show the number of attempts.
            label4.configure(text="ATTEMPTS : "+str(count))复制代码

步骤11:“关闭”按钮将触发reset()功能

此函数会将want_to_play变量设置为,False以便我们的应用程序关闭并且不会再次启动。然后它将关闭我们的应用程序的主窗口。

# define reset() function 
def reset():
  # Play sound file 
  three.play()
  # Change the variable to false
  global want_to_play
  want_to_play = false
  # Close the tkinter window
  root.destroy()复制代码

步骤12:主循环

我们必须进入主循环才能运行程序。如果我们的程序没有这一行,那么它将行不通。我们的程序将保持在主循环中,直到我们按下关闭按钮。

# Enter the mainLoop
root.mainloop()复制代码

完整代码

#Import required libraries :

from tkinter import *
import random
import tkinter.font as font
import simpleaudio as sa

want_to_play = True

while want_to_play==True:

    root = Tk()
    root.title("Guess The Number!")
    root.geometry(&#39;+100+0&#39;)
    root.configure(bg="#000000")
    root.resizable(width=False,height=False)
    root.iconphoto(True,PhotoImage(file="surprise.png"))

    #To play sound files:
    start = sa.WaveObject.from_wave_file("Start.wav")
    one = sa.WaveObject.from_wave_file("Win.wav")
    two = sa.WaveObject.from_wave_file("Lose.wav")
    three = sa.WaveObject.from_wave_file("Draw.wav")

    start.play()

    #Loading images :
    Check = PhotoImage(file="Check_5.png")
    High = PhotoImage(file="High_5.png")
    Low = PhotoImage(file="Low_5.png")
    Correct = PhotoImage(file="Correct_5.png")
    Surprise= PhotoImage(file ="Surprise.png")
    your_choice = PhotoImage(file="YOUR_GUESS.png")
    fingers = PhotoImage(file = "Fingers.png")
    close = PhotoImage(file="Close_5.png")

    #To have space between rows.
    root.grid_rowconfigure(1, minsize=30) 
    root.grid_rowconfigure(3, minsize=30) 
    root.grid_rowconfigure(5, minsize=30) 
    root.grid_rowconfigure(9, minsize=30)
    root.grid_rowconfigure(11, minsize=30) 

    #Generating random number :
    number = random.randint(1,9)

    #Using font module to modify the fonts :
    myFont = font.Font(family=&#39;Helvetica&#39;,weight=&#39;bold&#39;)

    #Creating the first label :
    label = Label(root,image=your_choice)
    label.grid(row=0,column=1)

    #Creating the entry box :
    e1 = Entry(root,bd=5,width=13,bg="#9ca1db",justify=CENTER,font=myFont)
    e1.grid(row=2,column=1)

    #Creating check button :
    b1 = Button(root,image=Check,command=lambda:show())
    b1.grid(row=4,column=3)

    #Creating close button :
    b2 = Button(root,image=close,command=lambda:reset())
    b2.grid(row=4,column=0)

    #Creaating second label :
    label2 = Label(root,image=fingers)
    label2.grid(row=6,column=1)

    #Creating third label :
    label3 = Label(root,image=Surprise)
    label3.grid(row=10,column=1)

    #Creating fourth label :
    label4= Label(root,text="ATTEMPTS : ",bd=5,width=13,bg="#34e0f2",justify=CENTER,font=myFont)
    label4.grid(row=12,column=1)

    #To display the correct image :
    num = PhotoImage(file=str(number)+str(".png"))    

    #Set the count to 0.
    #It stores the attempt value.
    count = 0

    def show():

        #Increase the count value as the user presses check button.
        global count
        count = count+1

        #Get the value entered by user.
        answer = e1.get()

        #If the entry value is null the goto reset() function.
        if answer=="":
            reset()

        #Convert it to int for comparision.
        answer = int(e1.get())

        if answer > number:
            #Play sound file.
            two.play()
            #Change the label to Too High.
            label2.configure(image=High)
            #Calls all pending idle tasks.
            root.update_idletasks()
            #Wait for 1 second.
            root.after(1000)
            #Clear the entry.
            e1.delete(0,"end")
            #Change the label to the original value.
            label2.configure(image=fingers)

        elif answer < number:
            #Play sound file.
            two.play()
            #Change the label to Too Low.
            label2.configure(image=Low)
            #Calls all pending idle tasks.
            root.update_idletasks()
            #Wait for 1 second.
            root.after(1000)
            #Clear the entry.
            e1.delete(0,"end")
            #Change the label to the original value.
            label2.configure(image=fingers)

        else:
            #Play sound file.
            one.play()
            #Show the CORRECT image.
            label2.configure(image=Correct)
            #Show the correct number.
            label3.configure(image=num)
            #Show the number of attempts.
            label4.configure(text="ATTEMPTS : "+str(count))

    #Define reset() function :            
    def reset():
        #Play the sound file.
        three.play()
        #Change the variable to false.
        global want_to_play
        want_to_play = False
        #Close the tkinter window.
        root.destroy()

    #Enter the mainloop :
    root.mainloop()复制代码

相关免费学习推荐:python视频教程

위 내용은 Python Tkinter 튜토리얼 숫자 추측 게임의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제