J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter

en premier

Pour l'apprentissage de python, il est normal de copier et coller quelque chose comme "CUI Othello en Python!" Qui traîne, mais avec le recul, qu'est-ce qui ne va pas? Même si vous essayez de comprendre chacun d'eux, le montant est important (pas important) pour les débutants.

Après tout, le meilleur moyen d'acquérir des connaissances est de bouger les mains et de les mémoriser tout en s'en souciant! Alors, pendant un certain temps, j'ai décidé d'utiliser CUI Othello comme interface graphique sans me fier au code existant. Je ne sais pas par quoi commencer ...

C'est une histoire courante pour les débutants d'essayer quelque chose qui reste et d'être frustré, alors pour le moment, j'ai changé ma direction pour une troisième ligne. Je sens que je peux le faire simplement en baissant un peu le niveau. C'est simple.

Si vous y réfléchissez avant de le faire, vous perdrez votre motivation, j'ai donc essayé de créer une troisième ligne par la méthode d'ajout de code, qui est étudiée et mise en œuvre au besoin.

Le code qui apparaît au milieu est découpé dans le produit fini, donc c'est peut-être un peu difficile à voir, mais ce n'est pas mal. La vue d'ensemble est au bas de la page

Image terminée Tictac.gif

Faire pour le moment

Commencez par créer un écran. Equipé d'un bouton. J'appuie sur le bouton. Je vais commencer d'ici.


from tkinter import *
from tkinter import ttk
from tkinter import messagebox

squares = 3

class TictacApp(ttk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.create_widgets()
        self.set_value()

    def create_widgets(self):
        for i in range(squares):
            for j in range(squares):
                button = ttk.Button(self, command=self.record(i, j))
                button.bind('<Button-1>', self.mark)
                button.grid(column=i, row=j, sticky=(N, S, E, W))

        for i in range(squares):
            self.columnconfigure(i, weight=1)
            self.rowconfigure(i, weight=1)

        self.master.columnconfigure(0, weight=1)
        self.master.rowconfigure(0, weight=1)

        self.grid(column=0, row=0, sticky=(N, S, E, W))


def main():
    root = Tk()
    root.title('Trois rangées')
    TictapApp(root)
    root.mainloop()


if __name__ == '__main__':
    main()

Apparemment, si vous importez quelque chose appelé Tkinter, vous pouvez installer des fonctions GUI. Il semble que vous puissiez changer l'apparence de différentes manières en donnant divers attributs au bouton, mais voici un arrangement 3x3 avec moins de boutons que la calculatrice tout en imitant la calculatrice. S'il y a mainloop () dans la fonction principale, il semble que vous puissiez l'utiliser tant que vous ne fermez pas la fenêtre. Il n'était pas possible de mettre une fonction dans le bouton, et à la suite de divers essais et erreurs, cela s'est résolu à ce qui précède.

Self que vous pouvez voir même si vous n'aimez pas utiliser python. Je ne l'ai pas encore bien compris, mais si je définis les variables utilisées dans plusieurs fonctions avec self, je peux les gérer. C'est une question de reconnaissance.

Si vous continuez en l'exécutant, vous pouvez garder votre motivation comme si quelque chose était terminé, et vous pouvez sentir quel code joue quel rôle, alors je l'ai utilisé cette fois-ci lorsque je voulais faire autre chose. Il semble que les pièces peuvent être appliquées comme un ensemble de voyage d'affaires.


def mark(self, event):
        if not event.widget['text']:
            if self.player == 1:
                event.widget['text'] = str('〇')
            else:
                event.widget['text'] = str('×')

Si l'écran est créé, nous ajouterons des fonctions cette fois. Lorsque vous appuyez sur le bouton, vous souhaitez afficher 〇 ou × là où vous appuyez dessus, alors ajoutez la fonction de marque à la classe Tictac. Si vous utilisez la méthode de liaison de Button, il semble que vous puissiez exécuter la fonction lorsque vous appuyez sur le bouton, créez donc une fonction qui affiche des caractères sur le bouton lorsque vous appuyez sur. Remplacez le texte de event.widget par str ('chaîne de caractères').


    def record(self, i, j):
        def x():
            if not self.field[i][j]:
                self.field[i][j] = self.player
                self.line_check()
                self.change_player()
                self.clear()
        return x

    def set_value(self):
        self.player = 1
        self.field = []
        for i in range(squares):
            self.field.append(['' for i in range(squares)])
        self.finish = 0

Si vous pouvez appuyer sur un bouton, il semble que vous deviez enregistrer quel joueur a appuyé sur quel bouton, alors créez une fonction d'enregistrement. J'ai créé une fonction set_value car il semble que le conteneur qui contient l'enregistrement sera également utilisé. En outre, les informations sur le joueur actuel et les paramètres de la décision finale sont également inclus. Dans la fonction d'enregistrement, les informations d'acquisition du joueur sont placées dans le conteneur, il est jugé si les trois lignes sont alignées, les joueurs sont remplacés et, si elle est réglée, le plateau est remis à l'état initial. J'étais très occupé. C'est une mauvaise partie de la méthode d'ajout de code.


    def line_check(self):
        cross = 0
        for i in range(squares):
            horizon = 0
            vertical = 0
            for j in range(squares):
                if self.field[i][j] == self.player:
                    horizon += 1
                if self.field[j][i] == self.player:
                    vertical += 1
            if self.field[i][i] == self.player:
                cross += 1
            if horizon == 3 or vertical == 3 or cross == 3:
                self.game_end()
        if self.field[0][2] == self.field[1][1] == self.field[2][0] == self.player:
            self.game_end()

Puisqu'il est devenu nécessaire de déterminer si la troisième ligne était alignée, j'ai créé une fonction line_check. Si vous regardez à l'intérieur verticalement, horizontalement et diagonalement et que trois valeurs sont identiques à celles du joueur, la partie est terminée. Le dernier jugement diagonal a été résolu par la force.


    def game_end(self):
        if self.player == 1:
            messagebox.showinfo('Règlement', 'Le joueur principal gagne!')
        else:
            messagebox.showinfo('Règlement', 'Le deuxième joueur gagne!')
        self.finish = 1

Si vous en alignez trois, vous devez nous faire part de la victoire ou de la défaite. Une implémentation de la fonction game_end. Lorsque la fonction game_end est appelée, une boîte de message apparaît pour vous informer du résultat et définir un indicateur de règlement.


    def change_player(self):
        if self.finish == 0:
            self.player = -self.player

    def clear(self):
        if self.finish == 1:
            self.create_widgets()
            self.set_value()

S'il n'est pas réglé, le joueur sera remplacé, et si tel est le cas, le plateau sera de nouveau créé et initialisé. C'est ainsi que la troisième ligne de personnes est complétée.

Impressions que j'ai faites

J'ai ajouté le code sur place, donc à la fin c'est devenu extrêmement difficile à voir. .. .. C'est terminé, donc ça va! Si vous essayez de le faire magnifiquement en pensant à l'image dans son ensemble, ce sera gênant, mais si vous ajoutez des fonctions au besoin tout en le faisant, je pense qu'il est facile de le mener à bien tout en maintenant la motivation telle qu'elle est. C'était facile à digérer car je vérifiais chaque fois que je les ajoutais un par un.

Cette fois, j'ai appris la fonction d'appuyer sur un bouton pour exécuter une fonction, alors je voudrais ensuite créer quelque chose avec plus de fonctions tout en l'incorporant.

L'ensemble du code du produit fini


from tkinter import *
from tkinter import ttk
from tkinter import messagebox

squares = 3


class TictacApp(ttk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.create_widgets()
        self.set_value()

    def set_value(self):
        self.player = 1
        self.field = []
        for i in range(squares):
            self.field.append(['' for i in range(squares)])
        self.finish = 0

    def create_widgets(self):
        for i in range(squares):
            for j in range(squares):
                button = ttk.Button(self, command=self.record(i, j))
                button.bind('<Button-1>', self.mark)
                button.grid(column=i, row=j, sticky=(N, S, E, W))

        for i in range(squares):
            self.columnconfigure(i, weight=1)
            self.rowconfigure(i, weight=1)

        self.master.columnconfigure(0, weight=1)
        self.master.rowconfigure(0, weight=1)

        self.grid(column=0, row=0, sticky=(N, S, E, W))

    def mark(self, event):
        if not event.widget['text']:
            if self.player == 1:
                event.widget['text'] = str('〇')
            else:
                event.widget['text'] = str('×')

    def record(self, i, j):
        def x():
            if not self.field[i][j]:
                self.field[i][j] = self.player
                self.line_check()
                self.change_player()
                self.clear()
        return x

    def change_player(self):
        if self.finish == 0:
            self.player = -self.player

    def line_check(self):
        cross = 0
        for i in range(squares):
            horizon = 0
            vertical = 0
            for j in range(squares):
                if self.field[i][j] == self.player:
                    horizon += 1
                if self.field[j][i] == self.player:
                    vertical += 1
            if self.field[i][i] == self.player:
                cross += 1
            if horizon == 3 or vertical == 3 or cross == 3:
                self.game_end()
        if self.field[0][2] == self.field[1][1] == self.field[2][0] == self.player:
            self.game_end()

    def game_end(self):
        if self.player == 1:
            messagebox.showinfo('Règlement', 'Le joueur principal gagne!')
        else:
            messagebox.showinfo('Règlement', 'Le deuxième joueur gagne!')
        self.finish = 1

    def clear(self):
        if self.finish == 1:
            self.create_widgets()
            self.set_value()


def main():
    root = Tk()
    root.title('Trois rangées')
    TictacApp(root)
    root.mainloop()


if __name__ == '__main__':
    main()

Recommended Posts

J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
J'ai essayé de faire la reconnaissance de caractères manuscrits de Kana Partie 3/3 Coopération avec l'interface graphique en utilisant Tkinter
J'ai essayé de créer diverses "données factices" avec Python faker
Fractal pour faire et jouer avec Python
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de détecter facilement les points de repère du visage avec python et dlib
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
[Python] J'ai essayé de faire une application qui calcule le salaire en fonction des heures de travail avec tkinter
Je veux faire un jeu avec Python
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé la synthèse de fonctions et le curry avec python
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
J'ai essayé fp-growth avec python
Programmation avec Python et Tkinter
J'ai essayé de gratter avec Python
J'ai essayé gRPC avec Python
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
Je veux gérer l'optimisation avec python et cplex
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de résoudre Soma Cube avec python
Suite ・ J'ai essayé de créer Slackbot après avoir étudié Python3
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé de résoudre la théorie des nombres entiers d'AOJ avec Python
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de prédire et de soumettre les survivants du Titanic avec Kaggle
J'ai essayé de trouver l'entropie de l'image avec python
Essayez de le faire avec GUI, PyQt en Python
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai essayé de toucher Python (installation)
J'ai essayé webScraping avec python.
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
[GUI en Python] PyQt5-Glisser-déposer-