@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:
Dann kann man das Modul ausführen, aber auch importieren, und zwar *ohne* dass dabei die `main()`-Funktion automatisch ausgeführt wird.