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) 
  • Wie kann ich einen StringVar mit einem Text-Widget in Python / Tkinter verbinden?
  • Python tkinter öffnen ein neues Fenster mit einer Schaltflächenaufforderung
  • Wie füge ich Event-Bindungen zu Items auf einer Leinwand mit Tkinter an?
  • Setzen von Gif-Bild in eine Leinwand mit Tkinter
  • Tkinter askopenfilename () wird nicht geschlossen
  • Progressbar (ttk.Progressbar) mit python in tkinter nicht zeigen
  • Warum ist Tkinter Entry's Funktion, die nichts zurückgibt?
  • Zugriff auf Variablen aus verschiedenen Klassen in tkinter python 3
  • Python tkinter deaktiviert die Schaltfläche, bis alle Felder gefüllt sind
  • Getting UnboundLocalError: Lokale Variable 'age' referenziert vor Zuweisungsfehler
  • Binden Sie ein TKinter-Widget an eine Funktion mit Args - Verwendung von Lambda
  • Python ist die beste Programmiersprache der Welt.