2016-04-30 13 views
0

Mein Ziel ist es, einen zufälligen Landgenerator zu erstellen, und die Flagge des Landes, das ausgewählt wird, wird angezeigt. Wenn die Bilddatei jedoch größer als die vorbestimmte Größe des Etiketts ist, wird nur ein Teil des Bildes angezeigt. Gibt es eine Möglichkeit, das Bild an das Etikett anzupassen? . (Alle anderen Fragen wie diese, die ich gesehen habe, sind beantwortet worden, die PIL oder Bild Module Erwähnens Getestet habe ich sie beide, und beide kamen mit diesem Fehler auf:Wie wird ein Bild an die Größe des Etiketts angepasst? (python)

Traceback (jüngste Aufforderung zuletzt): Datei "C: \ python \ country.py", Zeile 6, in Import PIL Import: Kein Modul namens 'PIL'

Dies ist mein Code, wenn es hilft:

import tkinter 
from tkinter import * 
import random 

flags = ['England','Wales','Scotland','Northern Ireland','Republic of Ireland'] 

def newcountry(): 

    country = random.choice(flags) 
    flagLabel.config(text=country) 
    if country == "England": 
     flagpicture.config(image=England) 
    elif country == "Wales": 
     flagpicture.config(image=Wales) 
    elif country == "Scotland": 
     flagpicture.config(image=Scotland) 
    elif country == "Northern Ireland": 
     flagpicture.config(image=NorthernIreland) 
    else: 
     flagpicture.config(image=Ireland) 

root = tkinter.Tk() 
root.title("Country Generator") 

England = tkinter.PhotoImage(file="england.gif") 
Wales = tkinter.PhotoImage(file="wales.gif") 
Scotland = tkinter.PhotoImage(file="scotland.gif") 
NorthernIreland = tkinter.PhotoImage(file="northern ireland.gif") 
Ireland = tkinter.PhotoImage(file="republic of ireland.gif") 
blackscreen = tkinter.PhotoImage(file="black screen.gif") 

flagLabel = tkinter.Label(root, text="",font=('Helvetica',40)) 
flagLabel.pack() 

flagpicture = tkinter.Label(root,image=blackscreen,height=150,width=150) 
flagpicture.pack() 

newflagButton = tkinter.Button(text="Next Country",command=newcountry) 
newflagButton.pack() 

Der Code funktioniert vollkommen in Ordnung, abgesehen davon, dass nur ein Teil des i Magier. Gibt es eine Möglichkeit, die Bilder innerhalb des Codes selbst, um die Größe? (Ich verwende Python 3.5.1)

Antwort

1

Wenn Sie PIL nicht installiert haben, müssen Sie zuerst

pip install pillow 

Nach der Installation installieren kann nun von PIL importieren:

from PIL import Image, ImageTk 

Tk Photobildes nur die Anzeige .gif kann, während ImageTk der PIL wird uns, dass wir die Größe des Bildes verwenden können, um verschiedene Bildformate in tkinter und PIL image-Klasse hat eine resize Methode lassen anzuzeigen.

Ich habe Ihren Code etwas getrimmt.

Sie können die Größe des Bildes ändern und dann nur die Beschriftung konfigurieren, die Beschriftung wird auf die Größe des Bildes erweitert. Wenn Sie dem Etikett eine bestimmte Höhe und Breite gegeben haben, sagen wir height=1 und width=1, und Sie haben die Größe des Bildes auf 500x500 geändert und dann das Widget konfiguriert. Es würde immer noch ein 1x1-Label anzeigen, da Sie diese Attribute explizit festgelegt haben.

Im folgenden Code, der das Diktat modifiziert, ist es nicht in Ordnung, ein Diktat zu modifizieren, während man darüber iteriert. dict.items() gibt eine Kopie des Diktats zurück.

Es gibt verschiedene Möglichkeiten, dies zu tun, nur ein Diktat war hier bequem.

Link to an image that's over the height/width limit - kitty.gif

from tkinter import * 
import random 
from PIL import Image, ImageTk 

WIDTH, HEIGHT = 150, 150 
flags = { 
    'England': 'england.gif', 
    'Wales': 'wales.gif', 
    'Kitty': 'kitty.gif' 
} 

def batch_resize(): 

    for k, v in flags.items(): 
     v = Image.open(v).resize((WIDTH, HEIGHT), Image.ANTIALIAS) 
     flags[k] = ImageTk.PhotoImage(v) 

def newcountry(): 

    country = random.choice(list(flags.keys())) 
    image = flags[country] 
    flagLabel['text'] = country 
    flagpicture.config(image=image) 

if __name__ == '__main__': 

    root = Tk() 
    root.configure(bg='black') 

    batch_resize() 

    flagLabel = Label(root, text="", bg='black', fg='cyan', font=('Helvetica',40)) 
    flagLabel.pack() 

    flagpicture = Label(root) 
    flagpicture.pack() 

    newflagButton = Button(root, text="Next Country", command=newcountry) 
    newflagButton.pack() 
    root.mainloop() 
Verwandte Themen