Nimmt 1 Positions-Argument, aber 2 wurden gegeben

Hallo, ich möchte ein Kommandozeilen-Tool laufen, um in einer separaten Funktion laufen zu lassen und an die Schaltfläche zu klicken, klicken Sie auf das zusätzliche Comando für dieses Programm, aber ich bekomme jedes Mal als Antwort

Nimmt 1 Positions-Argument, aber 2 wurden gegeben

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() 

der Fehler

 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 

Kann mir etwas körper helfen

Da ist etwas falsch mit args

2 Solutions collect form web for “Nimmt 1 Positions-Argument, aber 2 wurden gegeben”

Es liegt daran, dass Sie hier ein Positionsargument geben:

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

Befehl wünscht eine Rückruffunktion. Und du übergibst die Antwort von der adb Methode. (Siehe hier noch: http://effbot.org/tkinterbook/button.htm )

Wenn diese Zeile aufgerufen wird, wird self.adb("devices") aufgerufen. Wenn du deine Definition von adb

 def adb(self, **args): 

Sie fragen nur nach 1 Positions-Argument self und einer beliebigen Anzahl von Keyword-Argumenten **args dann nennen sie es self.adb("devices") mit 2 Positions-Argumenten von self und "devices"

Was Sie tun müssen, ist eine Zwischenmethode, wenn Sie die adb Methode allgemeiner haben wollen oder einfach nur "devices" in die adb Methode setzen.

bearbeiten

Siehe auch hier: http://effbot.org/zone/tkinter-callbacks.htm Siehe den Abschnitt "Argument zu Rückruf übergeben"

Bearbeiten 2: Codebeispiel

Wenn du das machst, sollte es funktionieren:

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

Und dann ändern Sie Ihre Funktion zu einem einzigen * inlieu von a ** (Keyword arg Expansion) Siehe hier: https://stackoverflow.com/a/36908/6030424 für mehr Erklärung.

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

Das Problem ist in der Art, wie du Args args : Es sollte *args (ein Sternchen) statt **args (zwei Sternchen) sein. Ein Asterisk spezifiziert eine beliebige Anzahl von Positionsargumenten, wobei als zwei Sternchen eine beliebige Anzahl von benannten Argumenten bedeutet.

Außerdem müssen Sie args korrekt an adb.exe :

 def adb(self, *args): process = subprocess.Popen(['adb.exe'] + args, stdout=subprocess.PIPE, shell=True) 
  • (Python) gaierror: [Errno 11004] getaddrinfo ist fehlgeschlagen
  • Zeichne ein Fenster in einem anderen
  • Tkinter Timer zum Start bei 0 bei Klick klicken
  • Variable Größenliste der Checkboxen in Tkinter?
  • Tkinter Splash Screen & Multiprocessing außerhalb von mainloop
  • Python Tkinter: Hinzufügen von Widgets zu Datei-Dialogen
  • ImportError beim Import von Tkinter in Python [Duplikat]
  • Kann die Funktion nicht mit checkbuttons mit tkinter arbeiten
  • Python tkinter 8.5 import messagebox
  • Python / Tkinter: Trap Textauswahl über Tastatur / Maus als Event?
  • Python-Bindung - erlauben mehrere Tasten gleichzeitig gedrückt werden
  • Python ist die beste Programmiersprache der Welt.