用python的tkinter庫制作仿windows看圖器

tkinter和PIL這兩個庫在python3.x是內(nèi)置的,不需要額外安裝

最近在學習python惩猫,就用python自己寫了一個仿windows的看圖器,在網(wǎng)上搜發(fā)現(xiàn)找不到相關的代碼震鹉,所以決定自己嘗試做了一個易桃「泊迹看圖器要實現(xiàn)如下功能:

  • 打開文件夾,找到相應文件
  • 圖片可以進行等比例縮放
  • 可以瀏覽同目錄下的上一張和下一張圖片

1.用label方法制作看圖器

由于python的tkinter庫只能打開gif文件不能打開jpg等其它文件炭臭,所以這里需要導入PIL庫永脓。tkinter的學習建議參考莫煩的視頻。莫煩tkinter教程鞋仍。講解非常詳細配有簡單案例適合初學者學習常摧。

import tkinter as tk
from PIL import ImageTK,Image
from tkinter import filedialog       #獲取文件全路徑

root=tk.Tk()   #創(chuàng)建對象
root.title('圖片查看器')     #窗口的名稱
root.geometry('400x400')     #規(guī)定窗口大小

l=tk.Label(root,text='pictures will show in this place', image=None)   #創(chuàng)建一個標簽
l.pack()     #放置標簽

def openpicture():
    global img
    filename=filedialog.askopenfilename()     #獲取文件全路徑
    img=ImageTk.PhotoImage(Image.open(filename))   #tkinter只能打開gif文件,這里用PIL庫
    # 打開jpg格式的文件
    l.config(image=img)    #用config方法將圖片放置在標簽中
 
b=kt.Button(root,text='select a picture', command=openpicture)  #設置按鈕威创,并給它openpicture命令
b.pack()

tk.mainloop()

我們開看一下運行效果:


窗口

點擊選擇按鈕:


選擇圖片

選擇一張圖片:
選擇一張圖片

圖片未顯示完全

這樣一個簡單的查看器就做完了落午,但是可以看到當圖片的像素太大的時候圖片無法顯示完全,所以需要對程序進行修改讓它能夠按標簽的大小進行縮放肚豺。

但是經(jīng)過我多次測試溃斋,geometry大小設置的是400x400,label標簽大小設置的是300x300吸申,但遺憾的是最后標簽填滿了整個窗口梗劫,猜測的原因可能是geometry和label的單位不同造成的,于是我改變了label的大小截碴,設置為30x300梳侨,但最終標簽仍然充滿了整個窗口,查閱資料沒能解決是什么原因?qū)е逻@一問題

將標簽背景設置成為黃色日丹,窗口400x400走哺,標簽height=30,weight=300聚凹,但標簽填滿了整個窗口

2.用canvas方法制作看圖器

在label方法遇到困難后轉(zhuǎn)向了canvas方法割坠,直接繪制畫布大小。由于每張圖片的尺寸不一樣妒牙,要想將圖片保持原來的長寬比顯示在canvas上需要將圖像進行縮放彼哼。
對函數(shù)進行縮放的方法參照這篇博文

import tkinter as tk
from PIL import ImageTk, Image
from tkinter import filedialog       #獲取文件全路徑

root=tk.Tk()  
root.title('圖片查看器')     
root.geometry('500x500')     

canvas=tk.Canvas(root,height=400,width=400)   #畫布長款定為400x400
canvas.pack()

def openpicture():
    global img
    filename=filedialog.askopenfilename()     #獲取文件全路徑
    image=Image.open(filename)        #打開圖片放到image中
    w,h=image.size     #獲取image的長和寬
    mlength=max(w,h)    #取最大的一邊作為縮放的基準
    mul=400/mlength    #縮放倍數(shù)
    w1=int(w*mul)
    h1=int(h*mul)
    re_image=image.resize((w1,h1))
    img=ImageTk.PhotoImage(re_image)    #在canvas中展示圖片
    canvas.create_image(200,200,anchor='center',image=img)   #以中小點為錨點
 
b=tk.Button(root,text='select a picture', command=openpicture)  #設置按鈕,并給它openpicture命令
b.pack()

tk.mainloop()
程序效果

程序效果

瀏覽上一張和下一張

這里我的思想是:

  • 先獲取該文件的完整路徑
  • 獲取該文件的上一級路徑
  • 獲取該文件的文件名
  • 通過os.listdir()獲取該文件夾下的所有文件并生成列表
  • 通過列表找到該文件的索引值
  • 將索引值+1湘今,-1實現(xiàn)上一張敢朱,下一張的功能
    思想很簡單,在這里我將之前得分代碼重新整理摩瞎,把不同功能進行了封裝
import tkinter as tk
from PIL import ImageTk,Image
from tkinter import filedialog
import os

root=tk.Tk()
root.title('圖片查看器')
root.geometry('500x500')

canvas=tk.Canvas(root,height=400,width=400)
canvas.pack()

path=tk.StringVar()

def resize(image):
    w, h = image.size
    mlength = max(w, h)  # 找出最大的邊
    mul = 400 / mlength  # 縮放倍數(shù)
    w1 = int(w * mul)  # 重新獲得高和寬
    h1 = int(h * mul)
    return image.resize((w1, h1))

def show_image(path):
    global img   #要申明全局變量我猜測是調(diào)用了canvas
    image = Image.open(path)  # 打開圖片
    re_image = resize(image)  # 調(diào)用函數(shù)
    img = ImageTk.PhotoImage(re_image)  # PhotoImage類是用來在label和canvas展示圖片用的
    canvas.create_image(200, 200, anchor='center', image=img)

def openpicture():
#打開一張圖片并顯示
    global fileindex,fatherpath,files,file_num

    filepath=filedialog.askopenfilename()
    fatherpath=os.path.dirname(filepath)      #獲取該路徑的上一級路徑
    filename=os.path.basename(filepath)   #獲取該路徑下的文件名
    files=os.listdir(fatherpath)     #該路徑下的所有文件并生成列表
    file_num=len(files)
    fileindex=files.index(filename)    #獲取當前文件的索引值
    show_image(filepath)


def previous():
    global fileindex, fatherpath, files,file_num
    fileindex -=1
    if fileindex == -1:
        fileindex = file_num-1
    filepath1=os.path.join(fatherpath, files[fileindex])
    show_image(filepath1)

def back():
    global fileindex, fatherpath, files,file_num
    fileindex += 1
    if fileindex == file_num:
        fileindex = 0
    filepath2 = os.path.join(fatherpath, files[fileindex])
    show_image(filepath2)

b=tk.Button(root,text='select a picture',command=openpicture)
b.pack()

b1=tk.Button(root,text='上一張',command=previous).pack(side='left')
b2=tk.Button(root,text='下一張',command=back).pack(side='right')

tk.mainloop()
圖片查看器
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拴签,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旗们,更是在濱河造成了極大的恐慌蚓哩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件上渴,死亡現(xiàn)場離奇詭異岸梨,居然都是意外死亡喜颁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門曹阔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來半开,“玉大人,你說我怎么就攤上這事赃份〖挪穑” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵抓韩,是天一觀的道長纠永。 經(jīng)常有香客問我,道長园蝠,這世上最難降的妖魔是什么渺蒿? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮彪薛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怠蹂。我一直安慰自己善延,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布城侧。 她就那樣靜靜地躺著易遣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫌佑。 梳的紋絲不亂的頭發(fā)上豆茫,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音屋摇,去河邊找鬼揩魂。 笑死,一個胖子當著我的面吹牛炮温,可吹牛的內(nèi)容都是我干的火脉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼柒啤,長吁一口氣:“原來是場噩夢啊……” “哼倦挂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起担巩,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤方援,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涛癌,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犯戏,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡窥浪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了笛丙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漾脂。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胚鸯,靈堂內(nèi)的尸體忽然破棺而出骨稿,到底是詐尸還是另有隱情,我是刑警寧澤姜钳,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布坦冠,位于F島的核電站,受9級特大地震影響哥桥,放射性物質(zhì)發(fā)生泄漏辙浑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一拟糕、第九天 我趴在偏房一處隱蔽的房頂上張望判呕。 院中可真熱鬧,春花似錦送滞、人聲如沸侠草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽边涕。三九已至,卻和暖如春褂微,著一層夾襖步出監(jiān)牢的瞬間功蜓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工宠蚂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留式撼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓肥矢,卻偏偏與公主長得像端衰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甘改,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容