非戰之罪

閱讀時間約 5 分鐘
寫程式最怕碰到的,就是信心滿滿地寫好程式後,發現結果不如預期,而且完全看不出問題出在哪裡。這種慘況可以分成兩種:一種是程式很長、很複雜,想要把心機很重,躲在幽暗深處的臭蟲給抓出來,即使有功能強大的除錯工具,都不是件簡單的事;另一種是程式沒幾行,一切看起來都很清楚正常,臭蟲根本沒地方躲藏,可是結果就是不對。不管是哪一種,最讓人傻眼翻白眼的是,焚膏繼晷、殫精竭慮地奮戰多時,搞到開始懷疑人生之後,卻赫然發現,根本沒有臭蟲!根本就不是程式的問題!
寫好畫fractal tree的程式之後,邊看著turtle在螢幕上畫圖邊在想:應該把畫圖的過程做成動畫才對,看著一棵樹慢慢長出來,應該會比只看最後的完成圖有趣多了。可惜turtle並沒有支援把畫面存成動畫的功能,只能另外想辦法。
要把fractal tree的生長過程做成動畫,最簡單的方式,就是用螢幕錄影軟體直接錄下來。不過這樣做的話,檔案會挺大的,而且如果放在網頁裡頭,還要靠播放器才能看。比較好的方式,應該是做成GIF檔,既輕巧又好處理,使用方式也可以比較多樣化。至於顏色方面,雖然GIF支援的顏色不多,不過fractal tree的顏色就只有黑、綠、紅,不會有失真的問題。想要這麼做,就得把畫面一張一張的塞進GIF檔。所以最關鍵的問題是:怎樣把畫面一張一張地擷取下來?
嘿!turtle有支援畫面存檔的功能耶!剛看到時,心想這就好辦了,可省去很多功夫。可是再仔細一看,心裡涼了半截,居然只能存成ps檔。想要用PIL這個module來處理ps檔,還得額外裝Ghostscript。這可不是個好主意,電腦裝了一堆不常用的東西,就好像房子塞滿了不常用的雜物,搞到後來整個亂七八糟,想整理都無從整理起。所以能不裝就不裝,應該有其他辦法。
網路爬文的結果,可以用PIL的ImageGrab.grab().crop((x0, y0, x1, y1))把左上角和右下角分別是(x0, y0)及(x1, y1)這個長方形的畫面擷取下來。程式就簡單的幾行而已:
screen = turtle.Screen()
cv = turtle.getcanvas()
x0, y0 = cv.winfo_rootx(), cv.winfo_rooty()
x1, y1 = x0+screen.window_width(), y0+screen.window_height()
img = ImageGrab.grab().crop((x0, y0, x1, y1))
程式是夠簡單的了,可是……為什麼擷取下來的畫面不是原先想的區域?那個長方形明顯框錯了範圍,而且框到的turtle畫面的部分,還有透明的效果,居然看得到原本應該被蓋住的Spyder畫面。
天啊!這究竟是怎麼回事?程式就這麼幾行,到底是哪裡的問題?莫非是搞錯那幾個設定長方形範圍參數的意思了?一堆問號啊!
要解決這個問題,當然就是在網路上找資料。不過在網路上爬文時,最讓人頭大的一點是,一大堆名詞攪和在一起,有時實在是很難分辨到底所指為何。最主要的原因,是因為turtle使用tkinter來當作畫圖的介面,所以網路上的討論文章,有些會把這兩個東西混雜在一起討論。糟糕的是,因為要擷取螢幕畫面,所以就必須清楚知道畫面的座標位置。這時候,就又牽涉到相對座標和絕對座標的問題。既然牽涉到座標,那就得先搞清楚screen、widget、window、canvas這些是指什麼東西,而winfo_rootx()、winfo_rootx()、winfo_x()、winfo_y()傳回來的,又是哪個東西的哪個座標……
爬文了幾天,費盡千辛萬苦,橫看、豎看、左看、右看,不管怎麼看,都看不出為什麼那個長方形會框錯範圍。這時候,心裡開始浮現是不是要使出最終極那一招的想法。這招絕對有效,只是效率奇差無比,而且就只能用那麼一次,下次當狀況改變時,就得又花上不少時間重新再來。
最終極那一招,招式簡單但有效,就像神鵰俠侶中的傻姑,面對武功高強的赤練仙子李莫愁,就只一支火叉呆板毫無變化的刺、刺、刺,便讓李莫愁左支右絀,幾十手變化全被封死,最後落荒而逃。那招就是:手動調整。慢慢地試、慢慢地調,直到那個長方形能準確框住要擷取的區域為止。
這終極的一招,施展起來實在是無聊透頂,頗讓人躊躇要不要這麼做,所以就在網路上東逛逛、西逛逛,實在是下不了決心。突然間,「咦?!莫非……」
火速調整Windows的設定,然後執行程式。居然……成功了!
天啊!原來這一切都是Windows的設定搞的鬼,程式根本就沒問題。因為現在電腦螢幕的解析度都很高,所以Windows的字體會變得非常小。這麼小的字體,如果不調整一下,實在是在虐待眼睛,所以習慣把Windows的「變更文字、應用程式與其他項目的大小」調大。把這個設定值調回建議的100%之後,就可以準確地擷取到需要的範圍了。以前在錄製螢幕畫面時,也曾因為這個原因,錄好的畫面都被切掉一塊,花了不少時間才搞清楚原因。因為時日已久,早就忘了這麼回事,沒想到現在居然又被同樣的設定問題整了一次。還好這次在使出終極一招之前,靈光乍現,發現了問題所在,免去了浪費大把時間做無聊事之苦。
這一切的一切,都跟程式無關,是非戰之罪啊!
為什麼會看到廣告
avatar-img
15會員
129內容數
寫點東西自娛娛人
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
ysf的沙龍 的其他內容
解決了Spyder和turtle之間的不合後,就來畫些漂亮迷人的fractal圖案,也順便練習一下recursive function的寫法。
龜兔賽跑,第一回合兔子因為太輕敵,在半路上呼呼大睡睡過頭,輸了比賽。 雖然輸了第一回合的比賽,不過兔子並沒有灰心喪志,牠記取教訓,買了個功能齊全的運動手錶來戴,睡覺前先定好鬧鐘時間,這樣就不怕睡過頭而輸了比賽。從此龜兔賽跑,兔子照樣在半路上睡覺補充體力,但再也沒有因為睡過頭而輸了比賽。
「學程式,數學要很好嗎?」這問題的答案其實很簡單,就是:Yes and no。
「天啊!這程式怎麼這麼醜!」瞪著螢幕上先前寫的程式,不禁從心底冒出這樣的一句話。
或許就如官網文件中所說的,lambda function就只是syntactic sugar而已,所以也就沒特別在意,直到在設計Game of Life的輸入介面時,因為需要用到,兜兜轉轉,費了好些功夫和時間,總算對它的用途和用法有比較完整的認識。
唉!這user可真難伺候啊~~~
解決了Spyder和turtle之間的不合後,就來畫些漂亮迷人的fractal圖案,也順便練習一下recursive function的寫法。
龜兔賽跑,第一回合兔子因為太輕敵,在半路上呼呼大睡睡過頭,輸了比賽。 雖然輸了第一回合的比賽,不過兔子並沒有灰心喪志,牠記取教訓,買了個功能齊全的運動手錶來戴,睡覺前先定好鬧鐘時間,這樣就不怕睡過頭而輸了比賽。從此龜兔賽跑,兔子照樣在半路上睡覺補充體力,但再也沒有因為睡過頭而輸了比賽。
「學程式,數學要很好嗎?」這問題的答案其實很簡單,就是:Yes and no。
「天啊!這程式怎麼這麼醜!」瞪著螢幕上先前寫的程式,不禁從心底冒出這樣的一句話。
或許就如官網文件中所說的,lambda function就只是syntactic sugar而已,所以也就沒特別在意,直到在設計Game of Life的輸入介面時,因為需要用到,兜兜轉轉,費了好些功夫和時間,總算對它的用途和用法有比較完整的認識。
唉!這user可真難伺候啊~~~
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
拋開文本、回歸音樂,朱宗慶打擊樂團全新擊樂劇場《六部曲》,除了演奏音樂,更試著從音樂發展劇場元素,帶給聽眾全身心的劇場與音樂體驗。駐團作曲家洪千惠也特別譜寫新曲《六棒傳奇之琴鍵奇緣》,將有八位團員同時使用六棒技法演奏馬林巴木琴,並順應音樂變化木琴的隊形等,對音樂家而言,是另一層次的新挑戰。
Thumbnail
你在這裡是為了被激勵,以自己的方式識見——去識見。只有在這種識見中,你才有可能最終與他人分享、賦能或使用任何你喜歡的語言,共享那種外在權勢。哦,看著這一切發生真是非常美麗的事情;只是看著。你必須解放Mind。你通過遵循策略和內在自主權/權勢來做到這一點。
Thumbnail
還記得小時候放學最開心的事,就是傍晚6點的卡通時間。在那個年代,電視頻道只有三台,中視、華視還有台視,電視節目都一定的時刻安排。傍晚6點是卡通,晚上7點是新聞,8點則是婆婆媽媽們最愛的八點檔連續劇。
Thumbnail
在深井私立醫院的天臺上,當藍色怪人與金色怪人的戰鬥結束,以及A.E.T部隊再次趕到的時候,現場所剩下的就祗是一片殘缺不堪的戰鬥痕跡!湯姆斯局長帶人在這裡善後的同時,在空中那艘媒體直升機的攝像鏡頭裏,也完整的拍攝了那兩個怪人的打鬥過程,民衆也完全透過媒體的拍攝看到了這場驚心動魄的對決,他們又再一次對這
Thumbnail
本書在運動上是紀實作品、回憶錄,在文學上卻像是懺情錄。黛西藉由回顧組織歷程,療養自身與阿爾瑪的互動斷裂、工會內鬥分裂後的創傷;她以第二人稱方式,重塑模擬與阿爾瑪間的對話,不斷反思組織者在組織過程中的感受與抉擇。這本書彷彿是浴火重生之後的告白,其再次的「變性」過程,從而成為提供給其他組織者的養分動能。
Thumbnail
    ​學習,最重要的意義是什麼呢?對康橋國際學校新竹校區的洪宜蓁而言,是「保有彈性的堅持努力」。國中時期在注重適性發展的康橋學習成長,煨養了她不怕困難的堅毅性格,並在不懈的努力下,克服數學魔王成功晉級A咖,在與學校齊步向前的過程中,以優異成績順利迎向心中的海闊天空,即將啟程北上師大附中。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
拋開文本、回歸音樂,朱宗慶打擊樂團全新擊樂劇場《六部曲》,除了演奏音樂,更試著從音樂發展劇場元素,帶給聽眾全身心的劇場與音樂體驗。駐團作曲家洪千惠也特別譜寫新曲《六棒傳奇之琴鍵奇緣》,將有八位團員同時使用六棒技法演奏馬林巴木琴,並順應音樂變化木琴的隊形等,對音樂家而言,是另一層次的新挑戰。
Thumbnail
你在這裡是為了被激勵,以自己的方式識見——去識見。只有在這種識見中,你才有可能最終與他人分享、賦能或使用任何你喜歡的語言,共享那種外在權勢。哦,看著這一切發生真是非常美麗的事情;只是看著。你必須解放Mind。你通過遵循策略和內在自主權/權勢來做到這一點。
Thumbnail
還記得小時候放學最開心的事,就是傍晚6點的卡通時間。在那個年代,電視頻道只有三台,中視、華視還有台視,電視節目都一定的時刻安排。傍晚6點是卡通,晚上7點是新聞,8點則是婆婆媽媽們最愛的八點檔連續劇。
Thumbnail
在深井私立醫院的天臺上,當藍色怪人與金色怪人的戰鬥結束,以及A.E.T部隊再次趕到的時候,現場所剩下的就祗是一片殘缺不堪的戰鬥痕跡!湯姆斯局長帶人在這裡善後的同時,在空中那艘媒體直升機的攝像鏡頭裏,也完整的拍攝了那兩個怪人的打鬥過程,民衆也完全透過媒體的拍攝看到了這場驚心動魄的對決,他們又再一次對這
Thumbnail
本書在運動上是紀實作品、回憶錄,在文學上卻像是懺情錄。黛西藉由回顧組織歷程,療養自身與阿爾瑪的互動斷裂、工會內鬥分裂後的創傷;她以第二人稱方式,重塑模擬與阿爾瑪間的對話,不斷反思組織者在組織過程中的感受與抉擇。這本書彷彿是浴火重生之後的告白,其再次的「變性」過程,從而成為提供給其他組織者的養分動能。
Thumbnail
    ​學習,最重要的意義是什麼呢?對康橋國際學校新竹校區的洪宜蓁而言,是「保有彈性的堅持努力」。國中時期在注重適性發展的康橋學習成長,煨養了她不怕困難的堅毅性格,並在不懈的努力下,克服數學魔王成功晉級A咖,在與學校齊步向前的過程中,以優異成績順利迎向心中的海闊天空,即將啟程北上師大附中。