Ausgabe von Daten im Terminal bei Eingabe im Tkinter

Fragen zu Tkinter.
Antworten
hlech65730
User
Beiträge: 9
Registriert: Samstag 10. Februar 2018, 19:28

Hello @ all,
ich habe ein Testprogramm für Tkinter ( Windows 10 ) geschrieben, in dem ich in einem Tkinter Fenster Daten ( Namen ) einlese und im Windows Terminal Fenster ausgeben lassen möchte. Hier ist der gesamte Code :

Code: Alles auswählen

# OS : Win 10
# C:\LegacyApp\Python36\python
# Erstes Fenster des Tkinter
# aus https://www.python-kurs.eu/tkinter_labels.php

try:
	from Tkinter import * # Python 2
except :
	from tkinter import * # Python 3



# definition of function upper radio button pressed which creates a picture in the window. The picture is in file  Rechteck_gelb_mit_Punkt_blau.gif
# see definiton of blue_img on the bottom of this script 
def upper_radio_button_pressed():
  canvas.create_image(20,20, anchor=NW, image=blue_img)
 
 # definition of function upper radio button pressed which creates a picture in the window. The picture is in file  Rechteck_gelb_mit_Punkt_rot.gif
# see definiton of red_img on the bottom of this script  
def lower_radio_button_pressed():
  canvas.create_image(20,20, anchor=NW, image=red_img)


# definition of class App which is handling the Quit  and the hello Button
class App:
  def __init__(self, master):
    frame = Frame(master)
    frame.pack()
    self.button = Button(frame, 
                         text="QUIT", fg="red",
                         command=frame.quit)
    self.button.pack(side=LEFT)
    
    self.slogan = Button(frame,
                         text="Hello",
                         command=self.write_slogan)
    self.slogan.pack(side=LEFT)
    
  def write_slogan(self): # definition of function write slogan. The text is written in the command line box only if the button Hello is pressed.
    print ("Tkinter is easy to use!")

# Tkinter window definition
root = Tk() 
root.title("First python Tkinter window") 

# width x height + x_offset + y_offset:
root.geometry("500x600+30+30") 

# define red label inside the window with text  "red Label"
w = Label(root, text="Red Label", bg="red", fg="white")

# automatic managing of geometrie ( pack manager )of label w  inside of the window
# means x coordinate is done automatically and Y coordinate is given ( for x use padx =...) 
w.pack(fill=X,pady=10)

# integer variable definition 
v = IntVar()

entry1 = Entry(root)
entry2 = Entry(root)


# definition of Label "Choose a programming language"
Label(root, 
      text="""Choose a 
programming language:""",
      justify = LEFT,
      padx = 20).pack()

      
 # definition of pushable radiobuttons with text  Phyton or Perl
Radiobutton(root, 
            text="Python",
            padx = 20, 
            variable=v, 
            value=1,
            command=upper_radio_button_pressed).pack(anchor=W) # call the function upper_radio_button pressed
            
Radiobutton(root, 
            text="Perl",
            padx = 20, 
            variable=v, 
            value=2,
            command=lower_radio_button_pressed).pack(anchor=W)# call the function upper_radio_button pressed

# a canvas is a graphical object, here blue_img and red_img 
# define the dimensions of the pictures  inside of the window and that it is shown inside of the window root 

canvas_width = 200
canvas_height = 100
canvas = Canvas(root, 
           width=canvas_width, 
           height=canvas_height)
canvas.pack()


#definition of picture blue_img 
blue_img = PhotoImage(file="D:\\uid_02589\\python\\30_Tkinter_Tutorial\\pictures\\Rechteck_grau_mit_Zeiger_gruen_links.PPM") 

#definition of picture red_img 
red_img = PhotoImage(file="D:\\uid_02589\\python\\30_Tkinter_Tutorial\\pictures\\Rechteck_grau_mit_Zeiger_rot_links.PPM")



# call of the class App with parameter root for the window
app = App(root)

Label(root,text="Vorname:").pack()
vorname = entry1.pack()

Label(root,text="Nachnahme:").pack()
nachname = entry2.pack()

#start window loop
root.mainloop()

print(vorname)
print(nachname)

der entscheidene Teil ist dieser hier :

Code: Alles auswählen

Label(root,text="Vorname:").pack()
vorname = entry1.pack()

Label(root,text="Nachnahme:").pack()
nachname = entry2.pack()

#start window loop
root.mainloop()

print(vorname)
print(nachname)

das funktioniert aber nicht ! Ausgegeben wird im Terminal :
None
None
------------------
(program exited with code: 0)
Drücken Sie eine beliebige Taste . . .

Wie kriege ich die Daten aus dem Tkinter Fenster raus. Was mich auch interessiert ist, wie man die Daten zwischen zwei Tkinter Fenstern austauscht und wie man diese zwei unabhängigen Fenster als Prozesse
( auch im Raspbian/ Debian ) überhaupt startet.
Vielen Dank , Hlech65730
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Die Rückgabe von pack() ist immer None. Was hast du denn vor?
Zum Auslesen benutzt man .get()
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hlech65730: Python 2 braucht man nicht mehr unterstützen, das hat sein Lebensende erreicht/überschritten.

Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.

Eingrückt wird in Python mit vier Leerzeichen pro Ebene.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Das zieht dann viele Änderungen nach sich, denn man hat dann keine globalen Variablen mehr. Alles was eine Funktion oder Methode ausser Konstanten benötigt, wird als Argument(e) übergeben. Und bei GUIs kommt man dann nicht um objektorientierte Programmierung (OOP) herum. Das ist teilweise mit der Klasse `App` ja schon da, aber dann sollte es auch die ganzen anderen globalen Variablen und Funktionen die da auf magische Weise drauf zugreifen, nicht mehr geben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

@hlech65730: neben dem schon gesagten solltest Du nicht immer neue Images in das Canvas packen, sondern ein vorhandenes Image nur verändern.

Code: Alles auswählen

import tkinter as tk
from functools import partial

class App:
    def __init__(self):
        root = tk.Tk()
        self.root = root
        tk.Label(root, text="Red Label", bg="red", fg="white").pack(fill=tk.X, pady=10)
        tk.Label(root, text="Choose a\nprogramming language:", justify=tk.LEFT, padx=20).pack()
        blue_img = tk.PhotoImage(file="blue.gif") 
        red_img = tk.PhotoImage(file="red.gif")
        self.programming_language = tk.IntVar(root)
        tk.Radiobutton(root, text="Python", padx=20, variable=self.programming_language,
            value=1, command=partial(self.button_pressed, blue_img)).pack(anchor=tk.W)
        tk.Radiobutton(root, text="Perl", padx=20, variable=self.programming_language,
            value=2, command=partial(self.button_pressed, red_img)).pack(anchor=tk.W)
        self.canvas = tk.Canvas(root, width=200, height=100)
        self.canvas.pack()
        self.radio_image = self.canvas.create_image(20,20, anchor=tk.NW)

        tk.Label(root, text="Vorname:").pack()
        self.vorname_entry = tk.Entry(root)
        self.vorname_entry.pack()
        tk.Label(root,text="Nachnahme:").pack()
        self.nachname_entry = tk.Entry(root)
        self.nachname_entry.pack()

        frame = tk.Frame(root)
        frame.pack()
        tk.Button(frame, text="QUIT", fg="red", command=self.quit).pack(side=tk.LEFT)
        tk.Button(frame, text="Hello", command=self.write_slogan).pack(side=tk.LEFT)
        self.vorname = self.nachname = None
    
    def write_slogan(self):
        print("Tkinter is easy to use!")

    def button_pressed(self, img):
        self.canvas.itemconfigure(self.radio_image, image=img)
 
    def mainloop(self):
        self.root.mainloop()

    def quit(self):
        self.vorname = self.vorname_entry.get()
        self.nachname = self.nachname_entry.get()
        self.root.quit()


def main():
    app = App()
    app.mainloop()
    print(app.vorname)
    print(app.nachname)

if __name__ == '__main__':
    main()
Antworten