从滚动条到画布的几个代码文件——Python学习笔记之十七
这一章的继续学习,比在前的照片涉及代码要轻松一些,代码打完后的预期结果总能实现。特别让人欣慰的一点,文本上的文字理解好像上了一个台阶,不用多次试探,就把作者的内蕴之意给理解了。接触了两个文件,一个是simpleedit.py,还有一个变换版的文本编辑文件simpleedit2.py。前一个文件一试就执行成功,后一个文件则把人给卡住了,究竟是什么意思呢?好在没有花上多少时间,这个文本二很快就拿了下来,值得做个记录。后面的那个画布的代码,虽然也是照片未能出现,但一个念头闪了一下,去掉图像的代码,却也展现了文件的一部分,好像也有记载记载的必要。
*
一、把文件打一次出空图,打两次文本内容就出现在图框中*。
先看代码simpleedit.py,因为sys没有定义,现在知道在代码前得有import sys,加进去之后,文件执行了,却是一个空图。
文件
from tkinter import *
from tkinter.simpledialog import askstring
from tkinter.filedialog import asksaveasfilename
from quitter import Quitter
import sys
from scrolledtext import ScrolledText
class SimpleEditor(ScrolledText):
def __init__(self, parent=None, file=None):
frm = Frame(parent)
frm.pack(fill=X)
Button(frm, text='Save', command=self.onSave).pack(side=LEFT)
Button(frm, text='Cut', command=self.onCut).pack(side=LEFT)
Button(frm, text='Paste', command=self.onPaste).pack(side=LEFT)
Button(frm, text='Find', command=self.onFind).pack(side=LEFT)
Quitter(frm).pack(side=LEFT)
ScrolledText.__init__(self, parent, file=file)
self.text.config(font=('courier', 9, 'normal'))
def onSave(self):
filename = asksaveasfilename()
if filename:
alltext = self.gettext()
open(filename, 'w').write(alltext)
def onCut(self):
text = self.text.get(SEL_FIRST, SEL_LAST)
self.text.delete(SEL_FIRST, SEL_LAST)
self.clipboard_clear()
self.clipboard_append(text)
def onPaste(self):
try:
text = self.selection_get(Selection='CLIPBOARD')
self.text.insert(INSERT, text)
except TclError:
pass
def onFind(self):
target = askstring('SimpleEditor', 'Search String?')
if target:
where = self.text.search(target, INSERT, END)
if where:
print(where)
pastit = where + ('+%dc' % len(target))
self.text.tag_add(SEL, where, pastit)
self.text.mark_set(INSERT, pastit)
self.text.see(INSERT)
self.text.focus()
if __name__=='__main__':
if len(sys.argv) > 1:
SimpleEditor(file=sys.argv[1]).mainloop()
else:
SimpleEditor().mainloop()
录入名称一次出空图
原来得重复两次命令客体,代码文本就出现了。指令好像不用讲什么道理,按指令做就行了。
有字符在图中了
二、文件simpleedit2.py的理解
接着看代码simpleedit2.py。代码二的文本是加进或者内嵌形成的,在上一个文件基础上组合进了滑动条,功能却和上述文本完全一样。但理解到这一点却有个过程,容我概略道来。在阅读代码文件时,两段…more…的字符还以为是文件上的内容呢,直到全部弄完执行时,出现systax error,我才感到,这个…more…的字符应该是另有含义。什么含义呢,将两个文件一对照,好像感觉来了。原来那个…more…的字符表示的是上一个文件的内容,你不过是把这个文件…more…字符之外的内容加进上一个文件而已。
这样理解之后在simpleedit1.py上,加进这些内容不就成了文件simpleedit2.py么,有点意思。于是就有了以下文件
文件simpleedit2.py
from tkinter import *
from tkinter.simpledialog import askstring
from tkinter.filedialog import asksaveasfilename
from quitter import Quitter
import sys
from scrolledtext import ScrolledText
class SimpleEditor(Frame):
def __init__(self, parent=None, file=None):
Frame.__init__(self, parent)
self.pack()
frm = Frame(self)
frm.pack(fill=X)
Button(frm, text='Save', command=self.onSave).pack(side=LEFT)
Button(frm, text='Cut', command=self.onCut).pack(side=LEFT)
Button(frm, text='Paste', command=self.onPaste).pack(side=LEFT)
Button(frm, text='Find', command=self.onFind).pack(side=LEFT)
Quitter(frm).pack(side=LEFT)
self.st = ScrolledText(self, file=file)
self.st.text.config(font=('courier', 9, 'normal'))
def onSave(self):
filename = asksaveasfilename()
if filename:
alltext = self.st.gettext()
open(filename, 'w').write(alltext)
def onCut(self):
text = self.st.text.get(SEL_FIRST, SEL_LAST)
self.st.text.delete(SEL_FIRST, SEL_LAST)
self.clipboard_clear()
self.clipboard_append(text)
def onPaste(self):
try:
text = self.selection_get(Selection='CLIPBOARD')
self.text.insert(INSERT, text)
except TclError:
pass
def onFind(self):
target = askstring('SimpleEditor', 'Search String?')
if target:
where = self.text.search(target, INSERT, END)
if where:
print(where)
pastit = where + ('+%dc' % len(target))
self.text.tag_add(SEL, where, pastit)
self.text.mark_set(INSERT, pastit)
self.text.see(INSERT)
self.text.focus()
if __name__=='__main__':
if len(sys.argv) > 1:
SimpleEditor(file=sys.argv[1]).mainloop()
else:
SimpleEditor().mainloop()
这个文件几乎就等价于前一个文件,同样出空图,同样两次重复文件名,这个文件的字符就出现在编辑器上。
含有文本字符的滑动编辑框
三、GUI中的照片出不来,但删除照片部分,也可以出彩色画图
照片这么快就进入编程的轨道之中,这是事先没有预料到。第八章就开始多处有导引照片的代码,但一涉及到照片,那个文件就无法执行。反复琢磨也没有找到解决的办法,这卡我好一段时间无法前行。但老停在一个地方也不是办法,前行到画布操作的那一部分,依然是照片出不来。怎办?我想到去掉那个photoimage部分,这么一操作,还有点效果,照片没有了,画布的半边还存留着,好像有点意思。
代码
'demo all basic canvas interfaces'
from tkinter import *
from PIL import Image
canvas = Canvas(width=525, height=300, bg='white')
canvas.pack(expand=YES, fill=BOTH)
canvas.create_line(100, 100, 200, 200)
canvas.create_line(100, 200, 200, 300)
for i in range(1, 20, 2):
canvas.create_line(0, 1, 50, 1)
canvas.create_oval(10, 10, 200, 200, width=2, fill='blue')
canvas.create_arc(200, 200, 300, 100)
canvas.create_rectangle(200, 200, 300, 300, width=5, fill='red')
canvas.create_line(0, 300, 150, 150, width=10, fill='green')
global photo
photo=PhotoImage(file='D:/python39/GUI/gifs/R4182.gif')
canvas.create_image(325, 25, image=photo, anchor=NW)
widget = Label(Canvas, text='Spam', fg='white', bg='black')
widget.pack()
canvas.create_window(100, 100, window=widget)
canvas.create_text(100, 280, text='Ham')
mainloop()
执行结果不妙:
D:\python39\GUI\Tour>python canvas1.py
Traceback (most recent call last):
File "D:\python39\GUI\Tour\canvas1.py", line 19, in <module>
photo=PhotoImage(file='D:/python39/GUI/gifs/R4182.gif')
File "D:\python39\lib\tkinter\__init__.py", line 4064, in __init__
Image.__init__(self, 'photo', name, cnf, master, **kw)
File "D:\python39\lib\tkinter\__init__.py", line 4009, in __init__
self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't open "D:/python39/GUI/gifs/R4182.gif": no such file or directory
D:\python39\GUI\Tour>
去掉那个照片代码部分,成canvas2.py
'demo all basic canvas interfaces'
from tkinter import *
canvas = Canvas(width=525, height=300, bg='white')
canvas.pack(expand=YES, fill=BOTH)
canvas.create_line(100, 100, 200, 200)
canvas.create_line(100, 200, 200, 300)
for i in range(1, 20, 2):
canvas.create_line(0, 1, 50, 1)
canvas.create_oval(10, 10, 200, 200, width=2, fill='blue')
canvas.create_arc(200, 200, 300, 100)
canvas.create_rectangle(200, 200, 300, 300, width=5, fill='red')
canvas.create_line(0, 300, 150, 150, width=10, fill='green')
widget = Label(canvas, text='Spam', fg='white', bg='black')
widget.pack()
canvas.create_window(100, 100, window=widget)
canvas.create_text(100, 280, text='Ham')
mainloop()
执行结果有图,GIF照片没有
说不定再往前走,这个gif的照片问题自然就有了点答案,期待。