从滚动条到画布的几个代码文件——Python学习笔记之十七

本文介绍了使用Python的Tkinter库创建文本编辑器的过程,包括simpleedit.py和simpleedit2.py两个文件,后者增加了滚动条功能。同时,讨论了在Canvas组件上绘制图形的问题,尽管遇到图片加载错误,但通过删除图片代码仍能展示基本图形。学习过程中,作者深化了对Tkinter控件和事件处理的理解。
摘要由CSDN通过智能技术生成

从滚动条到画布的几个代码文件——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的照片问题自然就有了点答案,期待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值