2017-05-09 6 views
1

Ich habe eine Excel-Tabelle, von der ich Informationen herüberhole. Dies wird wahrscheinlich irgendwann in eine Datenbank geändert werden, aber für den Test ist es in Ordnung. Es verfügt über zwei Spalten mit Daten und wie folgt aussieht:Python Tkinter Radioknöpfe aus einer Wörterbuchliste

Key | ProgramName |  Path 

0  | Calculator  |  C:\Windows\System32\calc.exe 
1  | Notepad  |  C:\Windows\System32\notepad.exe 

ich eine ziemlich grundlegende GUI mit Python Tkinter und die xlrd Bibliothek verwendet gebaut habe Daten aus der Tabelle in eine Liste zu extrahieren, die Wörterbucheinträge enthält.
https://pypi.python.org/pypi/xlrd

Das gibt mir eine Liste mit Wörterbucheinträgen:

[{'Path':'C:\Windows\System32\notepad.exe', 'Program':'Notepad', 'Key':0.0}, {'Path':'C:\Windows\System32\calc.exe', 'Program':'Calculator', 'Key':1.0}] 

Ich kann die Radio-Buttons erhalten arbeiten anständig, aber ich bin ein Problem mit den Pfaddaten ziehen und wiederverwenden, da ich wird (hoffentlich) subprocess.Popen verwenden, um das ausgewählte Programm tatsächlich zu öffnen.

Heres der Code so weit:

from Tkinter import * 
from xlrd import open_workbook 
import os 
import subprocess 

class App: 

def __init__(self, master): 

    frame = Frame(master) 
    frame.pack() 

    bottomframe= Frame(master) 
    bottomframe.pack(side = BOTTOM) 

    book = open_workbook('programlist.xls') 
    sheet = book.sheet_by_index(0) 

    # read header values into the list  
    keys = [sheet.cell(0, col_index).value for col_index in xrange(sheet.ncols)] 

    global dict_list 
    dict_list = [] 
    for row_index in xrange(1, sheet.nrows): 
     d = {keys[col_index]: sheet.cell(row_index, col_index).value 
      for col_index in xrange(sheet.ncols)} 
     dict_list.append(d) 

    self.w = StringVar() 
    self.w.set(dict_list[0]['Key']) # initialize 

    for eachprogram in dict_list: 
     self.c = Radiobutton(master, text=eachprogram['Program'], variable=self.w, value=eachprogram['Key']) 
     self.c.pack(anchor=W) 


    self.quitButton = Button(
     bottomframe, text="QUIT" , fg="red", command=frame.quit 
     ) 
    self.quitButton.pack(side=LEFT, anchor=S) 


    self.programRun = Button(bottomframe, text="Run", command=self.programRun) 
    self.programRun.pack(side=LEFT, anchor=S) 


def programRun(self): 
    ??? 

root = Tk() 

app = App(root) 

root.mainloop() 
root.destroy() 

nicht sicher, was ich tun muss, so dass, wenn die programRun Taste gedrückt wird, wird richtigen Pfad gezogen, so kann ich es in einen „subprocess.Popen“ Befehl setzen . Muss ich eine andere Variable erstellen? Kann ich diese Informationen mit einem Wörterbuchschlüssel abrufen?

Alle Vorschläge werden sehr geschätzt.

+0

Überprüfen Sie Ihre Formatierung. Es sieht so aus als ob 'programRun' eingerückt sein sollte. –

Antwort

1

Es ist keine schwere Aufgabe, den Weg von Ihrem Beispiel zu ziehen, und hier sind sogar zwei Optionen zur Auswahl. Und Sie müssen keine weitere Variable erstellen.

Nach Docs:

Die Variable muss die Option auf eine Regelgröße eingestellt werden, entweder eine IntVar oder eine StringVar. Alle Radiobuttons in einer Funktionsgruppe müssen dieselbe Steuervariable verwenden.

Setzen Sie die Wertoption für jeden Radiobutton in der Gruppe auf einen anderen Wert. Wenn der Benutzer einen Radiobutton setzt, wird die Variable auf die Wertoption dieses Radiobuttons gesetzt, und alle anderen Radiobuttons, die sich die Gruppe teilen, werden gelöscht.

Wie Sie sehen - Sie kein StringVar, aber DoubleVar da Ihre value Parameter (und Schlüssel) sind floats verwenden müssen. Nachteil hier - Sie müssen über die Liste iterieren, um jedes Wörterbuch für Key zu überprüfen.

try: 
    import tkinter as tk 
except ImportError: 
    import Tkinter as tk 


class App(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 

     self.frame = tk.Frame(self) 
     self.frame.pack() 

     self.bottomframe = tk.Frame(self) 
     self.bottomframe.pack(side=tk.BOTTOM) 

     # book = open_workbook('programlist.xls') 
     # sheet = book.sheet_by_index(0) 

     # read header values into the list 
     # keys = [sheet.cell(0, col_index).value for col_index in xrange(sheet.ncols)] 

     self.keys = ['Key', 'ProgramName', 'Path'] 
     self.dict_list = [{'Path': r'C:\Windows\System32\notepad.exe', 'Program': 'Notepad', 'Key': 0.0}, 
          {'Path': r'C:\Windows\System32\calc.exe', 'Program': 'Calculator', 'Key': 1.0}] 

     # global dict_list 
     # dict_list = [] 
     # for row_index in xrange(1, sheet.nrows): 
     # d = {keys[col_index]: sheet.cell(row_index, col_index).value 
     #  for col_index in xrange(sheet.ncols)} 
     # dict_list.append(d) 

     self.w = tk.DoubleVar() 
     self.w.set(self.dict_list[0]['Key']) # initialize 

     for each_program in self.dict_list: 
      self.c = tk.Radiobutton(self.master, text=each_program['Program'], variable=self.w, value=each_program['Key']) 
      self.c.pack(anchor=tk.W) 


     self.quitButton = tk.Button(
      self.bottomframe, text="QUIT", fg="red", command=self.frame.quit 
      ) 
     self.quitButton.pack(side=tk.LEFT, anchor=tk.S) 


     self.programRun = tk.Button(self.bottomframe, text="Run", command=self.programRun) 
     self.programRun.pack(side=tk.LEFT, anchor=tk.S) 

    def programRun(self): 
     print('Pulled path: %s' % self.search_list_dict()) 

    def search_list_dict(self): 
     try: 
      return [item for item in self.dict_list if item['Key'] == self.w.get()][0]['Path'] 
     except IndexError: 
      return '' 

app = App() 
app.mainloop() 

Als Alternative - Sie ein StringVar und Path Element als value Parameter verwenden können! Ändern Sie einfach einige Zeilen:

try: 
    import tkinter as tk 
except ImportError: 
    import Tkinter as tk 


class App(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     ... 
     self.w = tk.StringVar() 
     self.w.set(self.dict_list[0]['Path']) # initialize 

     for each_program in self.dict_list: 
      self.c = tk.Radiobutton(self.master, text=each_program['Program'], variable=self.w, value=each_program['Path']) 
      self.c.pack(anchor=tk.W) 
     ... 

    def programRun(self): 
     print('Pulled path: %s' % self.w.get()) 

app = App() 
app.mainloop() 
+0

TY für die Hilfe! Schätze eine so gut erklärte Antwort! – Shiroslullaby