Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Tkinter, console et IDLE

+3 votes

J'ai deux soucis avec un petit programme que je viens de finir.

Premier problème :

from tkinter import *
from tkinter.ttk import *

class View(object):
    """Classe de GUI"""

    def __init__(self):
        self.root= Tk()
        frame = Frame(self.root)
        frame.pack()

        self.root.title("OleLink")
        self.message = Text(frame, width=40, height=10, wrap=WORD)

        self.browse = Button(frame,
                             text="Fichier à traiter", width=15,
                             command=self.load_file)
        self.traiter = Button(frame,
                              text="Lancer", width=15,
                              )
        self.message.grid(row=0, column=0, columnspan=2)
        self.browse.grid(row=1, column=0, sticky='w')
        self.traiter.grid(row=1, column=1, sticky="e")

    def load_file(self) :
        fname = filedialog.askopenfilename(filetypes=(("Excel", "*.xls;*.xlsx"),
                                                      ("All files", "*.*") ))

        if fname:
            try:
                print(fname)
            except:
                messagebox.showerror("Open Source File", "Failed to read file\n'%s'" % fname)
            return

if __name__ == "__main__" :

    ### or nothing
    #root.style = Style()
    #root.style.theme_use("clam")
    ###
    app = View()
    app.root.resizable(0,0)

    app.root.mainloop()

Ce code s'exécute parfaitement dans IDLE, lorsque je presse F5.
Lorsque je le lance directement en cliquant dessus, en revanche, cette erreur apparait :

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
    return self.func(*args)
  File "D:\Code\Python\Coala\oview.py", line 26, in load_file
    fname = filedialog.askopenfilename(filetypes=(("Excel", "*.xls;*.xlsx"),
NameError: name 'filedialog' is not defined

C'est incompréhensible pour moi.

Le second problème est tout aussi étrange.

import subprocess, sys

class Olelink(object) :
    def __init__(self) :
        self.exe = "core.exe"
        self.v = View()
        self.v.root.resizable(0,0)

    def getPort(self) :
        """Renvoi le port écouté sur localhost du programme exe"""

        encoding = sys.stdout.encoding #encodage de la console

        #on trouve le pid du programme
        pid = subprocess.check_output("tasklist /fo csv", shell=True).decode(encoding).split("\r\n")

        #mise en forme
        pid = [x.replace('"','').split(",")[0:2] for x in pid]

        #on vérifie que le programme est bien lancé
        try :
            pid = [x for x in pid if x[0] == self.exe][0][1]
        except :
            print("Coala n'est pas lancé")
            sys.exit()

        #on récupère le port
        net = subprocess.Popen("netstat -ano", stdout=subprocess.PIPE, shell=True)
        find = subprocess.check_output("findstr "+str(pid), stdin=net.stdout, shell=True)
        net.stdout.close()
        net = find.decode(encoding).split("\r\n")

        #mise en forme
        ports = []
        for x in net :
            if x != "" :
                z = x.strip().split(" ")
                z = [y for y in z if y != ""]
                ports.append(z)

        #on récupère l'adresse du serveur OLE
        port = False
        for x in ports :
            if "127.0.0.1" in x[1] :
                port = x[1]

        #on vérifie que le serveur OLE est bien lancé
        if port :
            print("Serveur Ole détecté")
            return port
        else :
            print("Ole non initialisé, attendez et relancez")
            sys.exit()

if __name__ == "__main__" :
    app = Olelink()
    app.getPort()
    app.v.root.mainloop()

Ce programme se lance correctement au double-clic, aucune console n'apparait comme je le souhaite.
Cependant, si je le lance en mode *.pyw, plus rien ne se passe. Mon interface graphique ne se lance pas.

demandé 9-Jul-2015 par Zara (200 points)

1 Réponse

+2 votes
 
Meilleure réponse
NameError: name 'filedialog' is not defined

Signifie qu'il essaye d'utiliser la variable filedialog mais qu'il ne la trouve pas. Fais en début de fichier :

from tkinter import filedialog

D'une manière générale, n'utilise pas "import *" en dehors du shell, car tu ne sais pas tout ce que ça importe. Fait des imports explicites, c'est à dire en donnant à la main le nom de tout ce que tu importes.

Pour le deuxième problème, ouvre une question séparée : une question par problème, sinon on va tout mélanger.

répondu 10-Jul-2015 par Sam (4,980 points)
sélectionné 10-Jul-2015 par Zara

Effectivement ça fonctionne !

from tkinter import Tk, Frame, Button, Text, WORD, filedialog

C'est étrange comme comportement tout de même.
Merci beaucoup en tout cas !

...