放大,缩小和设置鼠标滚轮的最小值和最大值

时间:2018-09-29 01:17:42

标签: python python-3.x tkinter tkinter-canvas

我正在尝试实现代码的放大和缩小,但是我正在寻找如何在放大和缩小时缩放文本和行,还试图设置鼠标滚轮的最小值和最大值。

import tkinter as tk
from tkinter import *
import tkinter.font as tkFont

root=tk.Tk()
root.title("example")
vscrollbar = tk.Scrollbar(root)
FONT_NAME = "Helvetica"
font_size = 18
font_size1 = 5
Width = 10
w = 2000
h = 1500
x = 450
y = 77

r=root.geometry("%dx%d+%d+%d" % (w, h, x, y))
canvas= tk.Canvas(root,background = "white")


f=tk.Frame(canvas)
hscroll = tk.Scrollbar(canvas,orient=HORIZONTAL,command=canvas.xview)
vscroll = tk.Scrollbar(canvas,orient=VERTICAL,command=canvas.yview)
canvas.configure(xscrollcommand=hscroll.set,yscrollcommand=vscroll.set)
canvas.configure(scrollregion=(0,0,1000,1000))
hscroll.pack(side=BOTTOM,fill=X)
vscroll.pack(side=RIGHT, fill=Y)
canvas.pack(side=LEFT,fill= 'both', anchor=W, expand= True)

def _create_circle(self, x, y, r, **kwargs):
    return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)
tk.Canvas.create_circle = _create_circle

line1 = canvas.create_line(300,200,1200,200, width = 10, fill= 'black')
line2 = canvas.create_line(300,240,1200,240, width = 10, fill= 'black')
line3 = canvas.create_circle(270, 218, 35, width = 5)

text1 = canvas.create_text(380, 202, font= (FONT_NAME,1), text = 'final' , fill = 'Green')
text2 = canvas.create_text(380, 198, font= (FONT_NAME,1), text = 'text 2', fill = 'red')
text3 = canvas.create_text(380, 240, font= (FONT_NAME,1), text = 'text 3', fill = 'Blue')

def zoomin(event):
    global font_size
    global font_size1
    global Width
    d = event.delta

    if d < 0:
       amt=0.9
    else:
       amt=1.1

    canvas.scale(ALL,200, 200, amt, amt)

    font_size *= amt
    font_size1 *= amt
    Width *= amt
    canvas.itemconfigure(line1, width= float(Width))
    canvas.itemconfigure(line2, width= float(Width))
    canvas.itemconfigure(line3, width= float(Width))

    canvas.itemconfigure(text1, font= (FONT_NAME, int(font_size1)))
    canvas.itemconfigure(text2, font= (FONT_NAME, int(font_size1)))
    canvas.itemconfigure(text3, font= (FONT_NAME, int(font_size1)))

canvas.bind('<MouseWheel>', zoomin)
canvas.pack()

def zoomout(event):
    global font_size
    global font_size1
    global Width
    d = event.delta
    if d >0:
       amt=1.1
    else:
       amt=0.7
    canvas.scale(ALL, 200,200 , amt, amt)
    font_size *= amt
    font_size1 *= amt
    Width *= amt
    actual_width= Width-1
    canvas.itemconfigure(line1, width= float(actual_width))
    canvas.itemconfigure(line2, width= float(actual_width))
    canvas.itemconfigure(line3, width= float(actual_width))

    canvas.itemconfigure(text17, font= (FONT_NAME, int(font_size1)))
    canvas.itemconfigure(text18, font= (FONT_NAME, int(font_size1)))
    canvas.itemconfigure(text19, font= (FONT_NAME, int(font_size1)))

canvas.bind('<MouseWheel>', zoomout)
canvas.pack()

root.update()
canvas.config(scrollregion=canvas.bbox("all"))
root.mainloop()

这是我的代码,我试图在上面的代码中做同样的事情(缩放文本和行)

import tkinter as tk
import tkinter.font as tkFont

from tkinter import ttk
from tkinter import *

root = tk.Tk()
pressed = False

class Example(tk.Frame):
    def _create_circle(self, x, y, r, **kwargs):
        return self.create_oval(x-r, y-r, x+r, y+r, **kwargs)
    tk.Canvas.create_circle = _create_circle

    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.customFont = tkFont.Font(family="Helvetica", size=20)
        root.title("Test")
        self.canvas = Canvas(self, width=400, height=400, background="white")
        self.xsb = tk.Scrollbar(self, orient="horizontal", command=self.canvas.xview)
        self.ysb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
        self.canvas.configure(yscrollcommand=self.ysb.set, xscrollcommand=self.xsb.set)
        self.canvas.configure(scrollregion=(0,0,1000,1000))

        self.xsb.grid(row=1, column=0, sticky="ew")
        self.ysb.grid(row=0, column=1, sticky="ns")
        self.canvas.grid(row=0, column=0, sticky="nsew")
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

        self.canvas.create_line(300,160,1200,160, width = 10, fill= 'black')
        self.canvas.create_line(300,200,1200,200, width = 10, fill= 'black')

        self.canvas.create_circle(278, 180, 30, width = 10)

        FONT_NAME = "Helvetica"
        self.canvas.create_text(380, 157, font= (FONT_NAME,5), text = 'Text1', fill = 'Gray')
        self.canvas.create_text(380, 159, font= (FONT_NAME,5), text = 'Text2', fill = 'Red')
        self.canvas.create_text(380, 197, font= (FONT_NAME,5), text = 'Text3', fill = 'Gray')

        self.canvas.bind("<ButtonPress-1>", self.move_start)
        self.canvas.bind("<B1-Motion>", self.move_move)

        self.canvas.bind("<ButtonPress-2>", self.pressed2)
        self.canvas.bind("<Motion>", self.move_move2)

        self.canvas.bind("<Button-4>", self.zoomerP)
        self.canvas.bind("<Button-5>", self.zoomerM)

        self.canvas.bind("<MouseWheel>",self.zoomer)

        root.bind_all("<MouseWheel>",self.zoomer)

    def move_start(self, event):
        self.canvas.scan_mark(event.x, event.y)
    def move_move(self, event):
        self.canvas.scan_dragto(event.x, event.y, gain=1)

    def pressed2(self, event):
        global pressed
        pressed = not pressed
        self.canvas.scan_mark(event.x, event.y)
    def move_move2(self, event):
        if pressed:   
            self.canvas.scan_dragto(event.x, event.y, gain=1)

    def zoomer(self,event):        
        if (event.delta > 0):
            self.canvas.scale('all', event.x, event.y, 1.1, 1.1)
            self.canvas.configure(scrollregion = self.canvas.bbox("all"))

        elif (event.delta < 0):
            self.canvas.scale('all', event.x, event.y, 0.9, 0.9)
            self.canvas.configure(scrollregion = self.canvas.bbox("all"))

    def zoomerP(self,event):
        self.canvas.scale("all", event.x, event.y, 1.1, 1.1)
        self.canvas.configure(scrollregion = self.canvas.bbox("all"))

    def zoomerM(self,event):
        self.canvas.scale("all", event.x, event.y, 0.9, 0.9)
        self.canvas.configure(scrollregion = self.canvas.bbox("all"))


if __name__ == "__main__":
    Example(root).pack(fill="both", expand=True)
    root.mainloop()

我有3个问题:

  1. 如何实现从代码1到代码2相同的放大和缩小功能。

  2. 如何设置鼠标滚轮的最小值和最大值。

  3. 我遇到与UnicodeDecodeError相同的错误:'utf-8'编解码器无法解码位置0的字节0xff:两个代码中的无效起始字节。我该如何解决。

非常感谢您的帮助或建议。

谢谢。

0 个答案:

没有答案
相关问题