2016-06-13 22 views
1

別の関数で実行するコマンドラインツールを実行して、このプログラムの追加コマンドをクリックしますが、これを応答として取得するたびにボタンに渡します。は1つの位置引数をとりますが、2が与えられました

は1つの位置引数を取りますが、2は

from tkinter import * 
import subprocess 


class StdoutRedirector(object): 
    def __init__(self,text_widget): 
     self.text_space = text_widget 

    def write(self,string): 
     self.text_space.insert('end', string) 
     self.text_space.see('end') 

class CoreGUI(object): 
    def __init__(self,parent): 
     self.parent = parent 
     self.InitUI() 

     button = Button(self.parent, text="Check Device", command= self.adb("devices")) 
     button.grid(column=0, row=0, columnspan=1) 

    def InitUI(self): 
     self.text_box = Text(self.parent, wrap='word', height = 6, width=50) 
     self.text_box.grid(column=0, row=10, columnspan = 2, sticky='NSWE', padx=5, pady=5) 
     sys.stdout = StdoutRedirector(self.text_box) 

    def adb(self, **args): 
     process = subprocess.Popen(['adb.exe', args], stdout=subprocess.PIPE, shell=True) 
     print(process.communicate()) 
     #return x.communicate(stdout) 


root = Tk() 
gui = CoreGUI(root) 
root.mainloop() 

エラー

Traceback (most recent call last): 
    File "C:/Users/Maik/PycharmProjects/Lernen/subprocessExtra.py", line 33, in <module> 
    gui = CoreGUI(root) 
    File "C:/Users/Maik/PycharmProjects/Lernen/subprocessExtra.py", line 18, in __init__ 
    button = Button(self.parent, text="Check Device", command= self.adb("devices")) 
TypeError: adb() takes 1 positional argument but 2 were given 
Exception ignored in: <__main__.StdoutRedirector object at 0x013531B0> 
AttributeError: 'StdoutRedirector' object has no attribute 'flush' 

Process finished with exit code 1 

与えられたいくつかの体は私に

を助けることができます

button = Button(self.parent, text="Check Device", command= self.adb("devices")) 

コマンドが欲しいコールバック関数があります:** argsを

+1

は、我々は正確なエラーを見ることができ、そしてそれは – Li357

+0

'Traceback(最新の呼び出しの最後)が起こる特定の行: ファイルを「*/(root) ファイル "*/subprocessExtra.py"、行18、__init__内 ボタン=ボタン(self.parent、text = "Check Device"、command =TypeError:adb()は1つの位置引数を取るが、2つは与えられたで無視例外:<__メイン__ StdoutRedirectorオブジェクト0x013531B0で。> はAttributeError:「StdoutRedirector」オブジェクトが問題にする必要があります終了コード1 「 – MrChaosBude

+1

を終えていない属性「フラッシュ」 プロセスがあります:^)を – Li357

答えて

3

あなたがここにそれを位置引数を提供しているので、それがあると間違って何かがあります。あなたはadbメソッドからの応答を渡しています。 (http://effbot.org/tkinterbook/button.htm

その回線が呼び出されているときには、self.adb("devices")が呼び出されています。あなたはadb

def adb(self, **args): 

のあなたの定義を見れば あなただけの1つの位置引数selfとキーワード引数の任意の数を求めている**argsあなたはself"devices"

の2つの位置引数とself.adb("devices")それを呼び出していますadbメソッドをより一般的なものにしたい場合は、中間メソッドを使用するか、をadbメソッドに入れるだけです。また、ここで

編集

参照:http://effbot.org/zone/tkinter-callbacks.htmセクションは

編集2 "コールバックに引数を渡す" を参照してください:コード例

あなたがこれを行う場合は、それが動作するはずです:

button = Button(self.parent, text="Check Device", command=lambda: self.adb("devices")) 

あなたの機能を変更してくださいnを**の単一の*(キーワードarg拡張)より詳細な説明はhttps://stackoverflow.com/a/36908/6030424を参照してください。

def adb(self, *args): 
    process = subprocess.Popen(['adb.exe', args], stdout=subprocess.PIPE, shell=True) 
    print(process.communicate()) 
    #return x.communicate(stdout) 
+0

私は同じ定義を使用して他のより複雑なものを作成したいので、まだ固定されていないデバイスを使用したいと思う。 – MrChaosBude

+0

'button = Button(self.parent、text =" Check Device "、command = lambda (self、 "devises")) TypeError:adb(self.adb(self、 "devises"))エラー: ()は2つの位置引数を取りますが、3つが与えられました 例外が無視されました:<__ main __。StdoutRedirectorオブジェクト(0x01193230)> AttributeError: 'StdoutRedirector'オブジェクトに属性 'flush''がありません – MrChaosBude

+0

サンプルコードが追加されました。 –

2

問題は、あなたはargsを宣言する方法である:それは*args(1つのアスタリスク)の代わりに、**args(2つのアスタリスク)でなければなりません。 1つのアスタリスクは任意の数の位置引数を指定します.2つのアスタリスクは任意の数の名前付き引数を意味します。

はまた、あなたがargs正しいadb.exeに合格する必要があります。

def adb(self, *args): 
    process = subprocess.Popen(['adb.exe'] + args, stdout=subprocess.PIPE, shell=True) 
関連する問題