Увеличение, уменьшение и установка минимального и максимального значения для колеса мыши - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь реализовать увеличение и уменьшение масштаба кода, но я ищу, как масштабировать тексты и строки при увеличении и уменьшении, а также пытаюсь установить минимальное и максимальное значения для колеса мыши.

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» не может декодировать байт 0xff в позиции 0: недопустимый начальный байт в коде.Как мне это решить.

Буду очень признателен за любую помощь или предложения.

Спасибо.

...