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()
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? ... –
'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
Sie sollen eine Funktion als "Befehl" übergeben. – Goyo