2017-10-18 2 views
-1

Versuch, zwei Fenster zu machen. Eines zum Anzeigen eines zufälligen Bildes, das andere hat einen Knopf, der zu einem neuen zufälligen Bild wechselt. Derzeit, wenn ich einen Timer in der Display.update_image() setzen und es in der Display.__init__ aufrufen, kann ich es bekommen, um das Bild regelmäßig zu ändern.Tkinter Alter Kind Fenster von Eltern

Aber die update_image() Befehl in einer Schaltfläche im übergeordneten Fenster funktioniert nicht. Ist es möglich, das zweite Fenster von dem ersten zu ändern?

import tkinter as tk 
from PIL import Image, ImageTk 
import random 


def top_100(): 
    """ 
    Returns a list of the top 100 biggest NZ cities. 
    """ 
    file = open("Top100NZcities.csv") 
    cities = file.readlines() 
    return [city.strip() for city in cities] 


class UserInt(): 
    def __init__(self): 
     self.root = tk.Tk() 
     self.newWindow = tk.Toplevel(self.root) 
     self.app = Display(self.newWindow) 

     self.random_100_button = tk.Button(text = 'Random from top 100', 
              width = 50, 
              command = self.app.update_image())  
     self.random_100_button.pack() 
     self.root.mainloop() 


class Display(): 
    def __init__(self, master): 
     self.root = master 

     #Get the list of cities,. 
     self.cities = top_100() 

     #Set to fullscreen. 
     w, h = self.root.winfo_screenwidth(), self.root.winfo_screenheight() 
     self.root.overrideredirect(1) 
     self.root.geometry("%dx%d+0+0" % (w, h))   

     #Display initial image. 
     self.image_init = ImageTk.PhotoImage(Image.open("black_background.jpg")) 
     self.panel = tk.Label(self.root, image=self.image_init) 
     self.display = self.image_init 
     self.panel.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES) 

    def update_image(self): 
     """ 
     Replaces the screen's current image with a new random image. 
     """ 
     self.city = random.choice(self.cities) 
     self.image_rand = Image.open("NZ maps/{}_nz.png".format(self.city)) 

     #Rescale image to fit window. 
     w, h = self.root.winfo_screenwidth(), self.root.winfo_screenheight()   
     self.scale_factor = h/self.image_rand.height 
     self.scaled_image = self.image_rand.resize(
      (int(self.scale_factor * self.image_rand.width), h), Image.ANTIALIAS 
     ) 
     self.image_display = ImageTk.PhotoImage(self.scaled_image) 
     self.panel.configure(image=self.image_display) 
     print(self.city) 
     self.display = self.image_display 


def main(): 
    app = UserInt() 


if __name__ == '__main__': 
    main() 
+0

Was bedeutet "funktioniert nicht"? Stürzt das Programm ab? Erhalten Sie einen Fehler? Zeigt es das falsche Bild an? Erscheint das Bild an der falschen Stelle? ... –

+0

'command = self.app.update_image()' bedeutet, 'update_image()' 'JETZT JETZT 'aufzurufen und den Rückgabewert (der keiner ist) als Funktion zu speichern, die ausgeführt wird, wenn auf die Schaltfläche geklickt wird. Entfernen Sie die Klammern, damit Sie die tatsächliche Funktion und nicht das Ergebnis übergeben. – jasonharper

+0

Sie sollen eine Funktion als "Befehl" übergeben. – Goyo

Antwort

0

Wie von jasonharper in den Kommentaren oben angegeben.

Das Problem kommt aus dieser Zeile:

 self.random_100_button = tk.Button(text = 'Random from top 100', width = 50, command = self.app.update_image()) 

Wo Sie das Attribut command gesetzt self.app.update_image() gleichen Sie die Funktion ausführen und den Wert von None zu command zuweisen.

Das Entfernen der Klammern () aus der Deklaration sollte das Problem beheben, da Sie die Funktion selbst dem Wert command und nicht dem zurückgegebenen Wert der Funktion zuweisen.