Дополнительный пустой графический интерфейс tkinter при выполнении - PullRequest
0 голосов
/ 10 мая 2019

Я должен написать игру для школы.Я решил закодировать его в Pygame, но решил создать окно настроек в tkinter.Проблема в том, что когда я выполняю свой код, он приходит в два ткинтера: тот, который я хочу, и пустой графический интерфейс.

Что я должен сделать, чтобы решить эту проблему?

Спасибо!

import tkinter
import shutil


class Options(tkinter.Tk):

    def __init__(self):
        root = tkinter.Tk()
        root.maxsize(300,200)
        root.minsize(300,200)
        root.title('Difficulté du jeu')

        tkinter.Tk.__init__(self)
        tkinter.Label(root, text= 'Avant de démarrer, merci de selectionner \n une difficulté ou bien fermer la fenêtre pour restaurer \n les paramètres pérécdents. \n \n').pack()
        tkinter.Label(root, text= 'Facile ------------ Classique -------------Débutant').pack()
    
        g_slider_value = 0

        slider = tkinter.Scale(root, orient = tkinter.HORIZONTAL, length = 300, width = 20, sliderlength = 60, from_ = 45, to = 20, command = self.get_slider)
        slider.pack()
        self.slider = slider
        
        tkinter.Button(root, text='Enregistrer la valeur', command=self.show_values).pack()
        tkinter.Button(root, text='Quitter', command=root.destroy).pack()

    def get_slider(self, event):
	    g_slider_value  = self.slider.get()
	    print(g_slider_value)


        

    def show_values(self):
        monFichiersource = open('para.txt', 'r')
        monFichiersource.readline() 
        #celà permet de créer le fichier tout d'abord pour ensuite supprimer la première ligne si elle existe
        monFichiercible = open('para.txt', 'w')
        shutil.copyfileobj(monFichiersource, monFichiercible)
        #permet d'écraser les données de l'ancien fichier avec un nouveau vide

        monFichier=open('para.txt','a') #on ouvre le répertoire texte
        monFichier.write(str(self.slider.get())) #on ajoute la valeur du slider
        monFichier.close() #on ferme le fichier
        print('Paramètre enregistré.')

Options().mainloop()

1 Ответ

0 голосов
/ 10 мая 2019

Хорошо, так что вы объединяете 2 метода построения окна tkinter в один.Есть метод, отличный от ООП, который не использует класс, в котором вы обычно определяете Tk() как root и строите с использованием функций, а затем есть метод класса, где вы обычно наследуете от Tk() и строите свой графический интерфейс с использованием атрибутов класса иметоды.

Позволяет исправить ваш код.

Вы никогда не захотите вызывать Tk() более одного раза в tkinter.Причина, по которой вы видите 2 окна, заключается в том, что и ваш класс, и внутри __init__ вызывают Tk().

Вы также не закрываете 2 из 3 открытых вами файлов, поэтому, возможно, стоит рассмотреть возможность использования with open() вместоopen() как метод with open() закроется автоматически.

Вот ваш код очищен.

import tkinter as tk
import shutil


class Options(tk.Tk):
    def __init__(self):
        super().__init__()
        self.maxsize(300, 200)
        self.minsize(300, 200)
        self.title('Difficulté du jeu')
        tk.Label(self, text='Avant de démarrer, merci de selectionner'
                            '\n une difficulté ou bien fermer la fenêtre pour restaurer'
                            '\n les paramètres pérécdents. \n \n').pack()
        tk.Label(self, text='Facile ------------ Classique -------------Débutant').pack()
        g_slider_value = 0

        slider = tk.Scale(self, orient=tk.HORIZONTAL, length=300, width=20, sliderlength=60, from_=45, to=20,
                               command=self.get_slider)
        slider.pack()
        self.slider = slider

        tk.Button(self, text='Enregistrer la valeur', command=self.show_values).pack()
        tk.Button(self, text='Quitter', command=self.destroy).pack()

    def get_slider(self, event):
        g_slider_value = self.slider.get()
        print(g_slider_value)

    def show_values(self):
        with open('para.txt', 'r') as monFichiersource:
            monFichiersource.readline()

        with open('para.txt', 'w') as monFichiercible:
            shutil.copyfileobj(monFichiersource, monFichiercible)

        with open('para.txt', 'a') as monFichier:
            monFichier.write(str(self.slider.get()))

        print('Paramètre enregistré.')


Options().mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...