私はコマンドラインプログラム用のGUIフロントエンドの作成に取り組んできましたが、ここで得たすべてのヘルプは素晴らしいものでした。皆さんに感謝することはできません。
これが私が取り組んできたテストプログラムで、Windowsで.CABファイルの内容を表示します。
#!python2.7
import sys
import os
from tkFileDialog import *
from subprocess import *
from Tkinter import *
def getfilename():
blankline = 0 # counter to help remove blank lines
filename = askopenfilename(filetypes=[("All files","*"), ("Cab files","*.cab")]) # get the filename
if filename == "": # if the user hits the Cancel button, don't change anything in the list box
return
listbox.delete(0, END) # clear the list box
numberinlist = 0 # count the number of lines in the list box to delete the extra blank line at the end of the list
if os.name == 'nt': # send the command without opening a command window
start_info = subprocess.STARTUPINFO()
start_info.dwFlags |= subprocess._subprocess.STARTF_USESHOWWINDOW
commandline = Popen(['expand', '-D', filename], shell=False, stdout=PIPE, stdin=PIPE, stderr=STDOUT, startupinfo=start_info)
# commend the above 4 lines and uncomment the below line and the program works but opens a command window
#commandline = Popen(['expand', '-D', filename], shell=False, stdout=PIPE, stdin=PIPE, stderr=STDOUT)
while True: # read expand.exe's output and strip undeeded characters at the end of each line
listboxline = commandline.stdout.readline().rstrip()
listbox.insert(END, listboxline)
numberinlist += 1
if len(listboxline) ==0: # check for blank lines
blankline += 1
if blankline == 3: # expand.exe sends an extra three blank lines, see if it's the third blank line
listbox.delete(numberinlist - 1) # if it is the third blank line remove the extra line at the end
break # quit the while loop, expand.exe is finished after the third blank line
# set up the window
mywindow = Tk()
mywindow.geometry('400x400')
# add a frame to position the list box in
frame1 = Frame(mywindow)
frame1.pack(fill=BOTH, expand=1)
# name the scroll bars
vertscrollbar = Scrollbar(frame1, orient=VERTICAL)
horzscrollbar = Scrollbar(frame1, orient=HORIZONTAL)
# name the list box and attach the scroll bars
listbox = Listbox(frame1, selectmode=EXTENDED, yscrollcommand=vertscrollbar.set, xscrollcommand=horzscrollbar.set)
vertscrollbar.config(command=listbox.yview)
horzscrollbar.config(command=listbox.xview)
# create the scroll bars and list box
vertscrollbar.pack(side=RIGHT, fill=Y)
horzscrollbar.pack(side=BOTTOM, fill=X)
listbox.pack(side=LEFT, fill=BOTH, expand=1)
# add another frame to position the button in
frame2 = Frame(mywindow)
frame2.pack(fill=X)
# create the button and tell it to go to the getfilename function when clicked
filebutton = Button(frame2, text="Open cab file", command=getfilename)
filebutton.pack()
# start the GUI
mywindow.mainloop()
私はたくさんのコメントを追加したので、誰かが別の問題に対する答えを探しているなら、彼らはこのプログラムの例で答えを見つけるかもしれません。アイデアは、Windows、コマンドライン、シェルウィンドウのポップアップを表示せずに、'expand.exe -D'の結果を1行ずつリストボックスに表示することです。代わりに、バックグラウンドで表示します。最初の行(シバン)からわかるように、私はPython2.7を使用しています。私が抱えている問題は、エラーが発生していることです。
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
return self.func(*args)
File "D:\Python\2.7\listcab.pyw", line 17, in getfilename
start_info = subprocess.STARTUPINFO()
NameError: global name 'subprocess' is not defined
私はstackoverflowとGoogleでこのエラーを検索してきましたが、何も見つかりませんでした。インポートリストの単純な問題だと思いますが、それが何であるかわかりません。私はまだPythonのさまざまなインポートコマンドを完全には理解していません。どのコマンドを使用するか、いつ使用するか、そしてそれらの違いは何ですか。