Button soll zusätzlich Clipboard füllen . Nur wie ?

Fragen zu Tkinter.
Antworten
Punkadiddle
User
Beiträge: 3
Registriert: Dienstag 26. August 2014, 10:05

Hallo ,
ich bin absoluter Neuling was Phython angeht und habe eine Frage zu meinem ersten kleinen Programm .
Ich habe einige Button eingefügt die auch das tun was sie sollen ( eine Webseite öffnen )
zusätzlich sollen sie mir jehdoch auch das dazugehörige Benutzerpasswort in das Windows - Clipboard speichern.
Im Moment speichert er nur beim Öffnen des Programms etwas ins Clipboard. Welche Möglichkeiten gibt es einem Button 2 aufgaben zu geben ?

Code: Alles auswählen

import os
import subprocess
import webbrowser

from tkinter import *


def copy2clip(txt):   # HIER WIRD ETWAS INS CLIPBOARD GEPACKT 
   cmd='echo '+txt.strip()+'|clip'
   return subprocess.check_call(cmd, shell=True)
copy2clip('ABC')



fenster = Tk() 
fenster.title (" LG ")
fenster.geometry ("600x400")


def ausgabe1 (): 
     webbrowser.open ("www.wikipedia.de")

    
def ausgabe2 ():
    webbrowser.open ("www.google.de")

    
def ausgabe3 ():
    print ("pp")
    
def ausgabe4():
   os.system("start part.xls ")




knopf1 = Button (text=" 1", command=ausgabe1)
knopf1.pack()

knopf2= Button(text="2",command=ausgabe2)
knopf2.pack()

knopf3 = Button (text=" 3 ", command=ausgabe3)
knopf3.pack()

knopf4 = Button (text=" 4", command=ausgabe4)
knopf4.pack()





mainloop()
Also wenn ich knopf 1 drücke soll sich zum beispiel Google öffnen und 123 im clipboard sein
und bei knopf 2 wikipedia öffnen und 987 im clipboard
Zuletzt geändert von Anonymous am Dienstag 26. August 2014, 10:27, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@Punkadiddle: Die Frage in Verbindung mit dem gezeigten Quelltext deutet darauf hin, dass Du nicht verstanden hast was da im Quelltext steht. Denn dann wäre die Antwort für Dich offensichtlich. Darum würde ich empfehlen einen Schritt zurück zu gehen und Python zu lernen. Dann kannst Du die Frage selbst beantworten. Mit Quelltextstückchen aus dem Netz zusammen puzzlen und raten kommt man beim Programmieren nämlich nicht allzu weit. :-)
Punkadiddle
User
Beiträge: 3
Registriert: Dienstag 26. August 2014, 10:05

Jeder fängt wohl mal an und die Sache mit " der Weg ist das Ziel " stimmt definitiv.

Noch weiter Anfangen als ein sehr kleines GUI Programm zu schreiben welches 4 Button besitzt die " irgendwas " tun (?) .... nun ja wie gesagt jeder Anfang ist schwer
Die sache mit

def copy2clip(txt): # HIER WIRD ETWAS INS CLIPBOARD GEPACKT
cmd='echo '+txt.strip()+'|clip'
return subprocess.check_call(cmd, shell=True)
copy2clip('ABC')


ist ganz klar aus dem Netz gezogen natürlich.

der Rest eben weniger und tut ja auch das was es soll.

Gut wenn Sie mir nicht direkt zu einer Lösung verhelfen wollen dann könnten sie mir ja wenigstens sagen wo ich für dieses kleine Programm die richtigen Denkansätze herbekomme oder ich suche in diesem Forum eben Falsch nach Hilfestellungen

Mal ganz ehrlich man schreibt man ist neu in der Programierung und bekommt als Antwort " Lern programmieren " wenn ichs könnte würd ich mir doch nicht die Mühe machen hier nachzufragen
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Punkadiddle: die Zwischenablage-Funktion sollte so aussehen:

Code: Alles auswählen

def copy2clip(txt):
    subprocess.Popen(['clip'], stdin=subprocess.PIPE).communicate(txt)
dann formatierst Du Dir auch nicht ständig die Festplatte.

Zwei Befehle ausführen geht so:

Code: Alles auswählen

tu_dies()
tu_das()
BlackJack

@Punkadiddle: Klar fängt jeder mal an, aber GUIs bevor man Funktionen oder die lineare Abarbeitung von Code verstanden hat ist eben die falsche Reihenfolge. Ich finde eine GUI deutlich zu hoch gegriffen für den absoluten Anfang. Man fängt normalerweise mit den Grundlagen der Sprache an die man lernt und nicht mit einem Thema das all diese Grundlagen schon selbst als Voraussetzung hat *und* noch sein eigenen Eigenheiten mitbringt, nämlich das GUIs der Schritt von einem linearen Programmablauf bei dem der Programmierer die volle Kontrolle über die Reihenfolge des Programmablaufs hat, zu einem ereignisbasierten bei dem der Benutzer oder andere Ereignisquellen bestimmen wann was ausgeführt wird. Und IMHO sollte man für jede nicht absolut triviale GUI auch objektorientierte Programmierung verstanden haben bevor man zur GUI-Programmierung übergeht. Das wird man nämlich brauchen und beide Themen für sich sind schon kompliziert genug.

In der Python-Dokumentation befindet sich ein Grundlagentutorial und für absolute Programmieranfänger wird auch oft Learn Python The Hard Way empfohlen. (Nicht vom Titel irritieren lassen.)

Sonstige Anmerkungen zum Quelltext: Sternchenimporte sollte man vermeiden. Du holst Dir da knapp 190 Namen aus `tkinter` in das Modul. Wenn man das noch mit anderen Modulen macht, kann man nicht mehr einfach nachvollziehen aus welchem Modul eigentlich welcher Name kommt und es besteht auch die Gefahr von Namenskollisionen. Tkinter wird üblicherweise unter dem Namen `tk` importiert: ``import tkinter as tk``. Dann kann man beispielsweise mit `tk.Button` auf die `Button`-Klasse aus dem Modul zugreifen.

Die `copy2clip()` ist wenig robust weil die mit dem Inhalt von der Zeichenkette `txt` eine Shell startet und das Bestandteil von dem wird was die Shell dann ausführt. Das heisst das darf nichts enthalten was irgendwie besonders von der Shell (welche das auch immer konkret dann ist!) interpretiert wird. Das kann Probleme machen bis hin zu Sicherheitsproblemen wenn dort absichtlich jemand eine präparierte Zeichenkette einschleust mit der letztendlich beliebiger Shell-Code ausgeführt werden kann.

Ist auch letztendlich überflüssig weil Tk als GUI-Bibliothek schon die Möglichkeit bietet auf die Zwischenablage zuzugreifen.

Namen durchzunummerieren ist in der Regel ein Warnzeichen das man da etwas falsches macht. Meistens will man an der Stelle eine Datenstruktur verwenden, zum Beispiel eine Liste. Bei den `knopf*`-Namen macht das aber gar keinen Sinn. Da die hinterher überhaupt nicht verwendet werden, könnte man auch immer den selben Namen verwenden, oder die Namen komplett weg lassen und den `pack()`-Aufruf gleich auf dem Rückgabewert von `Button()` ausführen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht traditionell in einer Funktion mit dem Namen `main()` die dann mit folgendem Idiom aufgerufen wird:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Dann kann man das Modul ausführen, aber auch importieren, und zwar *ohne* dass dabei die `main()`-Funktion automatisch ausgeführt wird.
Punkadiddle
User
Beiträge: 3
Registriert: Dienstag 26. August 2014, 10:05

Vielen Dank , DAS war doch mal ne Hilfe und bietet Stoff sich weiter in das Thema reinzuarbeiten !
Hab das Problem allerdings mit
def ausgabe1 ():
webbrowser.open ("www.google.de")
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(win32con.CF_UNICODETEXT, 'test')
win32clipboard.CloseClipboard()

gelöst nun macht er auch das was ich will .


Vielen dank für die Hilfe , als nächstes JA die Grundlagen nachholen und DANN eure Lösungen testen weil ; Viele Wege führen nach Rom
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

Tkinter hat das eingebaut:
https://mail.python.org/pipermail/tkint ... 00096.html

Du kannst Dir auch dieses Modul ansehen:
https://pypi.python.org/pypi/pyperclip/
Atomkraftwerkaktienbesitzer
Antworten