执行时额外的空白tkinter GUI

时间:2019-05-10 18:17:21

标签: python python-3.x tkinter

我必须为学校编写一个游戏。我决定在Pygame中对其进行编码,但是我决定在tkinter中创建一个“设置”窗口。问题在于,当我执行代码时,它有两个tkinter:我想要的一个和空白的GUI。

我应该怎么做才能解决此问题?

谢谢!

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 :(得分:0)

好吧,所以您将将tkinter窗口的两种构建方法结合在一起。有一种非OOP方法不使用类,通常您将Tk()定义为root并使用函数进行构建,然后有一种类方法通常从Tk()继承并构建gui使用类的属性和方法。

让我们修正您的代码。

您永远不想在tkinter中多次呼叫Tk()。您看到2个窗口的原因是,您的班级和__init__内部都在调用Tk()

您也不会关闭打开的3个文件中的2个,因此可以考虑使用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()