prend 1 de position argument, mais 2 ont été donnés
Je voudrais lancer un outil en ligne de commande pour exécuter une fonction distincte et transmis au clic sur un bouton de la commande supplémentaires pour ce programme, mais chaque fois que je reçois cela comme une réponse.
prend 1 de position argument, mais 2 ont été donnés
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()
l'erreur
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
certains corps m'aider
il ya quelque chose de mal avec l' **args
- Peut-on voir l'erreur exacte, et la ligne où il se passe
- Traceback (most recent call last): File "*/subprocessExtra.py", à la ligne 33, in <module> gui = CoreGUI(root) le Fichier "*/subprocessExtra.py", à la ligne 18, dans init bouton = Button(self.parent, text="Vérifier" l'Appareil", command= self.la bad("devices")) TypeError: bad() prend 1 de position argument, mais 2 ont été donnés Exception ignoré dans: <__principaux__.StdoutRedirector objet au 0x013531B0> AttributeError: 'StdoutRedirector' objet n'a pas d'attribut "bouffées" le Processus est terminé avec le code de sortie 1
- Qui devrait être dans la question :^)
- Il ressemble au code en utilisant le redirecteur s'attend à une
flush
méthode, vous n'avez pas à fournir. Avez-vous essayé d'ajouter unflush
méthode pour le redirecteur? Vous êtes également à l'aide de lacommand
attribut de mal. Voir stackoverflow.com/q/5767228/7432 - J'essaie de comprendre à travers des extraits de code et essayez comme ils apprendre à coder. lambda ne worke
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous fournissez un de position argument est ici:
commande veulent une fonction de rappel. et vous êtes de passage à la réponse de la
adb
méthode. (voir ici pour plus d': http://effbot.org/tkinterbook/button.htm)lorsque cette ligne est appelée,
self.adb("devices")
est appelé.si vous regardez votre définition de
adb
Vous ne demandant qu'1 de position argument
self
et le nombre de mot-clé arguments**args
alors que vous êtes en l'appelantself.adb("devices")
avec 2 arguments positionnels deself
et"devices"
Ce que vous devez faire est d'avoir un intermédiaire de la méthode, si vous voulez avoir la
adb
méthode plus générale, ou tout simplement le mettre"devices"
dans leadb
méthode.modifier
Voir aussi ici: http://effbot.org/zone/tkinter-callbacks.htm Voir la section "Passing Argument de Rappels"
edit 2: exemple de code
Si vous le faites, cela devrait fonctionner:
puis de changer de fonction à un seul
*
inlieu d'un**
(mot-clé arg expansion) Voir ici: https://stackoverflow.com/a/36908/6030424 pour plus d'explication.button = Button(self.parent, text="Check Device", command=lambda: self.adb(self, "devises"))
erreur de direbutton = Button(self.parent, text="Check Device", command=lambda: self.adb(self, "devises")) TypeError: adb() takes 2 positional arguments but 3 were given Exception ignored in: <__main__.StdoutRedirector object at 0x01193230> AttributeError: 'StdoutRedirector' object has no attribute 'flush'
Le problème est dans la façon de déclarer
args
: il doit être*args
(un astérisque) au lieu de**args
(deux astérisques). Un astérisque indique un nombre quelconque d'arguments positionnels, où deux astérisques signifie n'importe quel nombre d'arguments nommés.Aussi, vous avez besoin de passer
args
correct deadb.exe
: