所以我在一個檔案夾中有幾張圖片,我想在 tkinter 上做一個小包打開器,如果我按下一個按鈕,它會隨機打開該檔案夾的影像并顯示它。所以我這樣做了:
import os
import random
from PIL import Image
from tkinter import *
def pack():
path ='C:\\Users\\matt\OneDrive\Images\cards'
files = os.listdir(path)
index = random.randrange(0, len(files))
image = Image.open(files[index])
image.show()
pack_button = Button(window,text = " Pack ",fg="white",bg = 'black',command = pack)
pack_button.grid(row = 2,column = 1,padx = 10,pady = 5)
window.mainloop()
問題是這個函式不想作業,它總是告訴我:
AttributeError: type object 'Image' has no attribute 'open'
有人可以幫幫我嗎?有人知道如何從影像中制作一個按鈕嗎?提前謝謝你。?
uj5u.com熱心網友回復:
假設您使用的是 Python 3,并且您有一個card images與 Python 腳本在同一目錄中命名的檔案夾,并且該檔案夾包含.png您的撲克牌影像,那么以下應該可以作業:
import tkinter as tk
def get_random_image_path():
from random import choice
from pathlib import Path
return str(choice(list(Path("card images").glob("*.png"))))
class Application(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title("Random card")
self.geometry("171x239")
self.resizable(width=False, height=False)
self.image = tk.PhotoImage(file=get_random_image_path())
self.button = tk.Button(self, image=self.image, command=self.assign_new_image)
self.button.pack()
def assign_new_image(self):
self.image = tk.PhotoImage(file=get_random_image_path())
self.button.configure(image=self.image)
def main():
application = Application()
application.mainloop()
return 0
if __name__ == "__main__":
import sys
sys.exit(main())

注意:我剛剛從Wikimedia Commons中獲取了三張公共領域卡片影像。您可以以不同的解析度下載它們.svg或以不同的.png格式下載它們。在我的情況下,我將它們下載為.pngs,解析度為171x239,這就是為什么我為 tkinter 視窗選擇相同尺寸的原因。由于我只下載了三張圖片,有時看起來好像單擊按鈕似乎沒有做任何事情,但事實并非如此 - 只是,只有三張圖片可供選擇,我們可能會選擇同一影像連續多次。
uj5u.com熱心網友回復:
要讓您的示例運行,請參閱下面的最小解決方案。對于現成的 Tkinter 程式并避免 PIL,請使用 Paul M. 的解決方案。
import os
import random
from PIL import Image
# assuming that this dir contains only images
# otherwise test if r is an image
img_folder = r'/home/ktw/Desktop/test_img'
def pack():
r = random.choice(os.listdir(img_folder))
image = Image.open(os.path.join(img_folder, r))
image.show()
if __name__=='__main__':
pack()
編輯:這應該適合你。只需將路徑更改為影像檔案夾的完整路徑即可。
choice(os.listdir(img_folder))只為您提供隨機檔案的名稱。os.path.join(img_folder, choice(os.listdir(img_folder)))從影像檔案夾和隨機影像構建絕對路徑,因此Tk.PhotoImage應該可以作業。
import tkinter as tk
import os
from random import choice
from pathlib import Path
img_folder = r'/home/ktw/Desktop/images'
def get_random_image_path():
return os.path.join(img_folder, choice(os.listdir(img_folder)))
class Application(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.title("Random card")
self.geometry("171x239")
self.resizable(width=False, height=False)
self.image = tk.PhotoImage(file=get_random_image_path())
self.button = tk.Button(self, image=self.image, command=self.assign_new_image)
self.button.pack()
def assign_new_image(self):
self.image = tk.PhotoImage(file=get_random_image_path())
self.button.configure(image=self.image)
if __name__=='__main__':
application = Application()
application.mainloop()
uj5u.com熱心網友回復:
import tkinter as tk
import os
from random import choice
from pathlib import Path
from PIL import Image
img_folder = r'C:\\Users\\matt\OneDrive\Images\cards'
def get_random_image_path():
return os.path.join(img_folder, choice(os.listdir(img_folder)))
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title("Random card")
self.resizable(width=False, height=False)
self.image = tk.PhotoImage(get_random_image_path())
self.button = tk.Button(self, image=self.image, command=self.assign_new_image)
self.button.pack()
def assign_new_image(self):
self.image = tk.PhotoImage(file=get_random_image_path())
self.button.configure(image=self.image)
if __name__=='__main__':
application = Application()
application.mainloop()
它說:
File "C:\Users\matt\OneDrive\Images\cards\pack opener.py", line 31, in <module>
application = Application()
File "C:\Users\matt\OneDrive\Images\cards\pack opener.py", line 22, in __init__
self.button = tk.Button(self, image=self.image, command=self.assign_new_image)
File "C:\Users\matt\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2679, in __init__
Widget.__init__(self, master, 'button', cnf, kw)
File "C:\Users\matt\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 2601, in __init__
self.tk.call(
_tkinter.TclError: image "C:\\Users\\matt\OneDrive\Images\cards\Vettel.png" doesn't exist
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/419412.html
標籤:
