0

私はコマンドラインプログラム用の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のさまざまなインポートコマンドを完全には理解していません。どのコマンドを使用するか、いつ使用するか、そしてそれらの違いは何ですか。

4

1 に答える 1

2

スターインポートを使用したため...

from subprocess import *

そこからインポートしたものにプレフィックスを付けるべきではありません:

subprocess.STARTUPINFO()

実際にはただ...

STARTUPINFO()

プレフィックスを使用する場合は、次のようにします...

import subprocess

subprocessからすべての名前をグローバル名前空間にインポートする代わりに、subprocessそれ自体をインポートするだけで、その名前をプレフィックス付きで使用できます。

次に、、、などsubprocess.Popen()を使用します。subprocess.STARTUPINFO()

これは一般に、インポートを行うための推奨される方法と考えられています。2 つの異なるモジュールに同様の名前の関数がある場合、名前の衝突を回避し、どこから来たのかを明確にします。

于 2013-01-27T18:48:06.520 に答える