Seite 1 von 1
Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Freitag 24. April 2020, 10:18
von 3cosystem
Hallo liebe Menschen,
ich moechte eine Tastendruckfunktion mit pynput.keyboard erstellen,
in der ich die zu drueckende Taste uebergeben moechte.
Vermutlich ist die Loesung simpel, ich bekomme dennoch nicht die richtige
Syntax hin...
Das habe ich:
Code: Alles auswählen
from pynput.keyboard import Key, Controller
keyboard = Controller()
keyboard.press(Key.f11)
keyboard.release(Key.f11)
Nun moechte ich das in eine Funktiuon packen und die Taste 'f11' uebergeben:
Code: Alles auswählen
from pynput.keyboard import Key, Controller
keyboard = Controller()
def tastedruecken(taste)
var = taste
keyboard.press(Key.var)
keyboard.release(Key.var)
tastedruecken('f11')
Dabei bekomme ich die Fehlermeldung, dass es 'var' "natuerlich" nicht als Taste gibt.
Wie bekomme ich das hin?
Meiner Ansaetze:
Code: Alles auswählen
taste = 'Key.f11'
keyboard.press(taste)
keyboard.release(taste)
taste = 'f11'
keyboard.press(Key.+taste)
keyboard.release(Key.+taste)
taste = 11
keyboard.press(Key.f+ str(taste))
keyboard.release(Key.f+ str(taste))
# f11 ist aber kein String Oo
taste = 'c'
keyboard.press(taste)
keyboard.release(taste)
# Das funktioniert dann wieder!
Ich arbeite mit Strings, das ist wohl mein Fehler ?!
Am liebsten wuerde ich den ganzen Klammerausdruck nach keyboard.press
uebergeben, um alle Tasten zu ersetzen.
Ich hoffe mir kann hier jemand weiterhelfen!
Ich bedanke mich herzlich im Voraus
Liebe Grueße
3co
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Freitag 24. April 2020, 10:27
von Jankie
So sollte es klappen:
Code: Alles auswählen
from pynput.keyboard import Key, Controller
keyboard = Controller()
def tastedruecken(taste):
keyboard.press(taste)
keyboard.release(taste)
tastedruecken(Key.f11)
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Freitag 24. April 2020, 11:35
von 3cosystem
Das tut, es....
Das lag auf der Hand..
Vielen Dank!
(Schade, dass man Threads nicht als "geloest" markieren kann...)
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 12:05
von 3cosystem
Hi Leute,
und wieder ein aehnliches Problem dazu:
Ich hab den Namen einer Variable. Am Ende gibts eine Ziffer,
die ich mit einer anderen Variable holen will.
Wie schreibt man das?
Code: Alles auswählen
from tkinter import *
class Gui:
def __init__(self, master):
self.master = master
self.var = StringVar()
self.radio1 = Radiobutton(self.master, variable=self.var, text='Auswahl eins', value="1")
self.radio1.pack()
self.radio2 = Radiobutton(self.master, variable=self.var, text='Auswahl zwei', value="2")
self.radio2.pack()
submit_button = Button(self.master, text="print", command=self.show_var)
submit_button.pack()
self.master.mainloop()
def show_var(self):
print(self.radio1['text']) # -> Aushwahl(1/2)
value = self.var.get()
print(value) # -> 1 oder 2
value2 = ('self.radio'+value)
print(value2) # -> self.radio(1/2)
value3 = value2['text']
print(value3) # -> error, hier will ich die 1/2 mit der value der Radiobuttons
Gui(Tk())
Das hat was mit der Syntax zu tun, wie sieht die allerdings aus?
Vielen Dank im Voraus
Liebe Grueße und einen schoenen Sonntag
3cosystem
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 12:51
von __blackjack__
@3cosystem: Du versuchst da komische Sachen. Der Wert den Du haben willst sollte als `value` an `Radiobutton` übergeben werden, dann kannst Du den mit `self.var.get()` ermitteln. Genau dafür ist das ja da.
Edit: Und man speichert ansonsten keine Werte in der GUI. Wenn Du den Text eines Widgets noch mal irgend wo anders brauchst, dann speicher den in einer Datenstruktur und nicht in der GUI.
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 12:55
von Sirius3
Benutze keine *-importe, weil man sich da unkontrolliert Namen in den eigenen Namensraum schaufelt. __init__ ist dazu da, etwas zu initialisieren, nicht dass es ewig läuft; das mainloop gehört da nicht rein.
Wenn man anfängt Variablen durchzunummerieren, dann will man eine passende Datenstruktur benutzen, hier wohl eine Liste.
Wenn Du aber den Wert von text wissen willst, dann sollte wohl value keine Zahl sondern der Inhalt von text sein:
Code: Alles auswählen
import tkinter as tk
class Gui(tk.Tk):
def __init__(self):
super().__init__()
self.var = tk.StringVar(self, "Auswahl eins")
for text in ["Auswahl eins", "Auswahl zwei"]:
tk.Radiobutton(self, variable=self.var, text=text, value=text).pack()
tk.Button(self, text="print", command=self.show_var).pack()
def show_var(self):
value = self.var.get()
print(value)
def main():
gui = Gui()
gui.mainloop()
if __name__ == '__main__':
main()
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 14:53
von 3cosystem
Hallo,
vielen Dank erst mal dafuer!!
Zur Zeit ist mein Code 300 Zeilen lang. Deswegen konstruiere ich lauffaehige
Beispiele, die mein Problem verdeutlichen.
Leider benoetige ich unbedingt die values(0, 1) als Int, weil diese spaeter in meinem Script
als Index fuer eine Liste verwende. (Hatte ich in meinem ersten Bsp. falsch...)
Damit bekomme ich direkt die Infos aus den values passend zu den Namen der Button.
So verwende ich das spaeter. Die value stimmt mit der Stelle der Liste ueberein (; :
Code: Alles auswählen
radio_list = ["4529", "6872"] # natuerlich viele mehr
driver.get('https://blabla/?page=blabla&id=' + radio_list[self.var.get()])
Als Konstrukt nach Sirius3 Beispiel ohne Liste, weil mir das zu "kompliziert" ist, weil dann gleich
diese lambda-Geschichte mit kommt. Die muss ich mir erst ansehen...
So soll es aussehen (und funktionieren, als Bsp.):
Code: Alles auswählen
import tkinter as tk
class Gui(tk.Tk):
def __init__(self):
super().__init__()
self.var = tk.IntVar(self, 0)
self.radio1 = tk.Radiobutton(self, variable=self.var, text="Bank-Seite", value=0).pack()
self.radio2 = tk.Radiobutton(self, variable=self.var, text="Flohmark-Seite", value=1).pack()
tk.Button(self, text="print", command=self.show_var).pack()
def show_var(self):
id = self.var.get()
# Erste Verwendung:
print('Website: '+self.radio+id['text']) # Hier soll self.radio(0/1)['text'] rauskommen^^
# AttributeError: '_tkinter.tkapp' object has no attribute 'radio'
# Zweite Verwendung:
radio_list = ["4529", "6872"]
print('https://blabla/?page=blabla&id=' + radio_list[id])
def main():
gui = Gui()
gui.mainloop()
if __name__ == '__main__':
main()
Ich hoffe, jetzt ist es eindeutiger. Ich fange gerade an mich ueberall einzufinden.
Brauchte alleine 30 min fuer das Testscript hier^^
Vielen Dank
Den support finde ich echt klasse hier!
LG
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 15:04
von Sirius3
Das Konzept bleibt das selbe, benutze Listen. Bei Dir kommt zusätzlich als Designfehler dazu, dass zusammengehörige Daten über den gesamten Quellcode verteilt sind.
Code: Alles auswählen
import tkinter as tk
WEBSITES = {
{"name": "Bank-Seite", "id": "4529"},
{"name": "Flohmark-Seite", "id": "6872"},
}
class Gui(tk.Tk):
def __init__(self):
super().__init__()
self.var = tk.IntVar(self, 0)
for index, website in enumerate(WEBSITES):
tk.Radiobutton(self, variable=self.var, text=website['name'], value=index).pack()
tk.Button(self, text="print", command=self.show_var).pack()
def show_var(self):
index = self.var.get()
website = WEBSITES[index]
print(website['text'])
print(f"https://blabla/?page=blabla&id={website['id']}")
def main():
gui = Gui()
gui.mainloop()
if __name__ == '__main__':
main()
Wenn damit wirklich irgendwelche Webseiten aufgerufen werden, dann benutzt man natürlich Parameter, statt sich da Strings mit Query-Values zusammenzuformatieren.
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 16:02
von 3cosystem
@sirius3
Klasse vielen Dank!
Das bastle ich jetzt mal in mein Script.
Bekomme hier zwar noch ein unhashable type: dict, aber
das laesst sich irgendwie loesen.
Ich versuche immer alle Variablen etc, in meine Klassen und Funktionen unter zu bekommen.
Hatte "irgendwo" gelesen, dass diese außerhalb als "global" angesehen werden und das zu vermeiden ist...
Einen schoenen Restsonntag
LG
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 16:11
von Sirius3
Ja, falsche Klammern:
Code: Alles auswählen
WEBSITES = [
{"name": "Bank-Seite", "id": "4529"},
{"name": "Flohmark-Seite", "id": "6872"},
]
Das ist eine Konstante, sieht man an der Schreibweise, Konstanten sind global, aber das ist auch keine Problem, da ja konstant.
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 16:52
von 3cosystem
Sirius3 hat geschrieben: Sonntag 26. April 2020, 16:11
Ja, falsche Klammern:
Code: Alles auswählen
WEBSITES = [
{"name": "Bank-Seite", "id": "4529"},
{"name": "Flohmark-Seite", "id": "6872"},
]
Das ist eine Konstante, sieht man an der Schreibweise, Konstanten sind global, aber das ist auch keine Problem, da ja konstant.
Alles klar, danke.
Noch eine letzte Frage, um es gleich "schick" zu machen.
Wie hole aus einem Entry die "id" fuer WEBSITES?
Vermutlich mit .insert()?
Code: Alles auswählen
import tkinter as tk
WEBSITES = [
{"name": "Bank-Seite", "id": "4529"},
{"name": "Flohmark-Seite", "id": "6872"},
{"name": "ID", "id": self.insert.get()} #klar, hier existiert self. ja noch nicht
]
class Gui(tk.Tk):
def __init__(self):
super().__init__()
WEBSITES.insert({name, ID}, {id, self.insert.get()})
self.var = tk.IntVar(self, 0)
for index, website in enumerate(WEBSITES):
tk.Radiobutton(self, variable=self.var, text=website['name'], value=index).pack()
tk.Button(self, text="print", command=self.show_var).pack()
self.insert = tk.Entry(self).pack()
def show_var(self):
index = self.var.get()
website = WEBSITES[index]
# print(website['text'])
print(website['name'])
print("https://blabla/?page=blabla&id={website['id']}")
print()
def main():
gui = Gui()
gui.mainloop()
if __name__ == '__main__':
main()
Damit ist die Konstante nicht mehr konstant...
Danke!
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 17:26
von Sirius3
Kannst Du genauer beschreiben, was Du damit bezwecken willst? Was soll dieses Entry-Feld?
Ich dachte, die IDs kommen aus den Radio-Buttons?
`self.insert` wird an den Rückgabewert von pack gebunden, also None, das ist nicht sinnvoll.
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 17:34
von 3cosystem
Es geht darum, etwas variabel zu bleiben.
So koennen auch IDs manuell eingegeben werden, die nicht in der RaioButton-Auswahl sind.
Bzw die letzte Auswahl greift auf die selbst eingegebene ID aus dem Entry-Feld zu.
Re: Varibale in einem Funktionsausdruck - keyboard.press(Key.Variable)
Verfasst: Sonntag 26. April 2020, 20:18
von Sirius3
Das ist ja eine ganz andere Funktionalität, die Du auch getrennt implementieren mußt.