标签: tkinter-canvas

Python:PIL - [Errno 32]保存.png时断管

我在这里要做的是使用PIL将Tkinter Canvas的内容保存为.png图像.

这是我的保存功能('graph'是画布).

def SaveAs():
    filename = tkFileDialog.asksaveasfilename(initialfile="Untitled Graph", parent=master)
    graph.postscript(file=filename+".eps")
    img = Image.open(filename+".eps")
    img.save(filename+".png", "png")
Run Code Online (Sandbox Code Playgroud)

但它得到了这个错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python27\lib\lib-tk\Tkinter.py", line 1410, in __call__
    return self.func(*args)
  File "C:\Users\Adam\Desktop\Graphing Calculator\Graphing Calculator.py", line 352, in SaveAs
    img.save(filename+".png", "png")
  File "C:\Python27\lib\site-packages\PIL\Image.py", line 1406, in save
    self.load()
  File "C:\Python27\lib\site-packages\PIL\EpsImagePlugin.py", line 283, in load
    self.im = Ghostscript(self.tile, self.size, self.fp)
  File "C:\Python27\lib\site-packages\PIL\EpsImagePlugin.py", line 72, in Ghostscript
    gs.write(s)
IOError: [Errno 32] Broken pipe
Run Code Online (Sandbox Code Playgroud)

我在Windows 7,Python 2.7.1上运行它.

我该如何工作?

python tkinter python-imaging-library tkinter-canvas

4
推荐指数
1
解决办法
1953
查看次数

Python Tkinter使用PIL将画布保存为图像

我有这个代码,让用户在画布上绘制并将其保存为jpeg文件.

正如在这篇文章中提到,我试图在画布和内存中使用PIL并行绘制,以便我可以将其保存为jpeg而不是postscript.它似乎工作,直到我发现我用PIL保存的一些图像与画布上绘制的图像不一样.

我假设canvas.create_line并且draw.line从PIL图像绘制模块功能类似,并应给出类似的输出.

以下是出了什么问题:

例如,当我绘制"T"时,它似乎没问题(左边是我的绘图,右边是保存的图像).

在此输入图像描述在此输入图像描述

但是当我绘制"A"时,输出图像看起来有点奇怪.

在此输入图像描述在此输入图像描述

这是我目前的代码:

import Tkinter as tk
import Image,ImageDraw

class ImageGenerator:
    def __init__(self,parent,posx,posy,*kwargs):
        self.parent = parent
        self.posx = posx
        self.posy = posy
        self.sizex = 200
        self.sizey = 200
        self.b1 = "up"
        self.xold = None
        self.yold = None 
        self.coords= []
        self.drawing_area=tk.Canvas(self.parent,width=self.sizex,height=self.sizey)
        self.drawing_area.place(x=self.posx,y=self.posy)
        self.drawing_area.bind("<Motion>", self.motion)
        self.drawing_area.bind("<ButtonPress-1>", self.b1down)
        self.drawing_area.bind("<ButtonRelease-1>", self.b1up)
        self.button=tk.Button(self.parent,text="Done!",width=10,bg='white',command=self.save)
        self.button.place(x=self.sizex/7,y=self.sizey+20)
        self.button1=tk.Button(self.parent,text="Clear!",width=10,bg='white',command=self.clear)
        self.button1.place(x=(self.sizex/7)+80,y=self.sizey+20)

        self.image=Image.new("RGB",(200,200),(255,255,255))
        self.draw=ImageDraw.Draw(self.image)

    def save(self):
        print self.coords
        self.draw.line(self.coords,(0,128,0),width=3)
        filename = "temp.jpg"
        self.image.save(filename) …
Run Code Online (Sandbox Code Playgroud)

python tkinter python-imaging-library tkinter-canvas

4
推荐指数
1
解决办法
8149
查看次数

Python&tkinter:canvas.lift和canvas.lower重叠按钮不起作用

我使用tkinter和python 3.4在画布上创建了两个重叠的按钮:

button1位于button2下方

现在我想把button1带到前面(你现在看不到的按钮,因为它在按钮2下面)

self.canvas.lift(self.button1)
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,这不起作用.什么都没发生.降低button2也无效.你能告诉我为什么吗?

import tkinter as tk

class Example(tk.Frame):
    def __init__(self, root):
        tk.Frame.__init__(self, root)
        self.canvas = tk.Canvas(self, width=400, height=400, background="bisque")
        self.canvas.create_text(50,10, anchor="nw", text="Click to lift button1")
        self.canvas.grid(row=0, column=0, sticky="nsew")
        self.canvas.bind("<ButtonPress-1>", self.click_on_canvas)

        self.button1 = tk.Button(self.canvas, text="button1")        
        self.button2 = tk.Button(self.canvas, text="button2")

        x = 40
        self.canvas.create_window(x, x, window=self.button1)
        self.canvas.create_window(x+5, x+5, window=self.button2)



    def click_on_canvas(self, event):

        print("lifting", self.button1)
        self.canvas.lift(self.button1)
        self.canvas.lower(self.button2)


if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(fill="both", expand=True)
    root.mainloop()
Run Code Online (Sandbox Code Playgroud)

python tkinter tkinter-canvas

4
推荐指数
1
解决办法
2589
查看次数

Tkinter画布不显示

我正在尝试学习一些Python和Tkinter.下面的示例代码旨在在屏幕上放置两个窗口,一些按钮和一个带有图像的Canvas,并在其上绘制一些线条.

窗口和按钮看起来很好,但是我没有看到画布图像或画布线.我很感激帮助找出制作画布的必要条件.

from Tkinter import *
import Image, ImageTk

class App:

    def __init__(self, master):

    def scrollWheelClicked(event):
        print "Wheel wheeled"

    frame = Frame(master)
    frame.pack()
    self.button = Button(frame, text = "QUIT", fg="red", command=frame.quit)
    self.button.pack(side=LEFT)

    self.hi_there = Button(frame, text="Hello", command=self.say_hi)
    self.hi_there.pack(side=LEFT)

    top = Toplevel()
    canvas = Canvas(master=top, width=600, height=600)

    image = Image.open("c:\lena.jpg")
    photo = ImageTk.PhotoImage(image)
    item = canvas.create_image(0, 0, image=photo)

    canvas.create_line(0, 0, 200, 100)
    canvas.create_line(0, 100, 200, 0, fill="red", dash=(4, 4))
    canvas.create_rectangle(50, 25, 150, 75, fill="blue")

    canvas.pack

    testBtn = Button(top, text = "test …
Run Code Online (Sandbox Code Playgroud)

python tkinter tkinter-canvas

3
推荐指数
1
解决办法
7653
查看次数

Python - Tkinter 画布中的文本输入

我想在我用 Tkinter 创建的画布内为整数创建一个用户输入框。我将如何去做这件事?

def gamescreen():
    photo = PhotoImage(file="gamescreen.gif")
    canvas.bind("<Button-1>", buttonclick_gamescreen)
    canvas.pack(expand = YES, fill = BOTH)
    canvas.create_image(1, 1, image = photo, anchor = NW)
    e1 = Entry(canvas)
    e2 = Entry(canvas)
    game1 = PhotoImage(file="1.gif")
    canvas.create_image(30, 65, image = game1, anchor = NW)
    canvas.create_window(window = e1, x=10, y=10)
    canvas.create_window(window = e2 , x=400, y=10)    
    canvas.update()
    window.mainloop()
Run Code Online (Sandbox Code Playgroud)

这是我目前所拥有的,但画布上的任何地方都没有出现输入框。我知道这可能不是在 python 中创建游戏的最有效方式,但我不熟悉任何其他方式。

谢谢你的帮助。

编辑:我已经使用提供的建议更新了代码。我现在有一个问题

IndexError: tuple index out of range
Run Code Online (Sandbox Code Playgroud)

这发生在以下几行

canvas.create_window(window = e1, x=10, y=10)
canvas.create_window(window = e2, x=400, y=10)
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我知道出了什么问题,我不得不删除 x= 和 y= …

python user-input tkinter tkinter-canvas

3
推荐指数
1
解决办法
1万
查看次数

在python中使用两个TKinter"页面"中的FigureCanvasTkAgg

我试图获得两个TKinter'页面',每个页面使用matplotlib动画函数更新不同的绘图.

问题只是其中一个页面正确显示了情节.

这是代码:

import matplotlib
matplotlib.use("TkAgg")

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation

import Tkinter as tk
import ttk

a = Figure(figsize=(4,4))
plot_a = a.add_subplot(111)

b = Figure(figsize=(4,4))
plot_b = b.add_subplot(111)

x = [1,2,3,4,5]
y_a = [1,4,9,16,25]
y_b = [25,16,9,4,1]


def updateGraphs(i):

    plot_a.clear()
    plot_a.plot(x,y_a)

    plot_b.clear()
    plot_b.plot(x,y_b)

class TransientAnalysis(tk.Tk):

    def __init__(self,*args,**kwargs):

        tk.Tk.__init__(self,*args,**kwargs)
        tk.Tk.wm_title(self, "Transient Analysis GUI: v1.0")

        container = tk.Frame(self)      
        container.pack(side="top", fill="both", expand=True)      
        container.grid_rowconfigure(0, weight=1)
        container.grid_columnconfigure(0, weight=1)

        self.frames = {}

        for F in ( GraphPageA, GraphPageB): …
Run Code Online (Sandbox Code Playgroud)

python tkinter matplotlib tkinter-canvas

3
推荐指数
1
解决办法
9364
查看次数

MatplotLib按轴获取所有注释

我正在用Python和Tkinter做一个项目。我可以绘制数据数组,并且还实现了一个函数,当我用鼠标单击时可以在图上添加注释,但是现在我需要我添加的所有注释的列表。有什么办法吗?这是我添加注释的功能:

def onclick(self, event):

    clicked = []
    key = event.key
    x = event.xdata
    y = event.ydata

    x_d = min(range(len(self.x_data)), key=lambda i: abs(self.x_data[i] - x))
    local_coord = self.x_data[x_d - 6:x_d + 6]
    x_1 = max(local_coord)
    indx = np.where(self.x_data == x_1)[0][0]
    y_1 = self.y_data[indx]



    if key == "v":
        self.ax.annotate("{0}nm".format(int(x_1)), size=25,
                         bbox=dict(boxstyle="round",fc="0.8"),
                         xy=(x_1, y_1), xycoords='data',
                         xytext=(x_1, y_1+50), textcoords='data',
                         arrowprops=dict(arrowstyle="-|>",
                                         connectionstyle="bar,fraction=0",
                                         ))

    self.canvas.draw()
Run Code Online (Sandbox Code Playgroud)

python matplotlib tkinter-canvas

3
推荐指数
1
解决办法
1368
查看次数

在Tkinter的画布小部件中更改矩形的宽度

在此示例代码中,我尝试了几种更改蓝色矩形宽度的方法。似乎没有任何作用。在代码中,“ a”表示介于1.00和0.00之间的float变量。该值用于计算“ b”,它是蓝色矩形的所需宽度(以像素为单位)。我有一些相当复杂的代码可以生成该值,至少可以正常工作。为了使代码正常工作,蓝色矩形的宽度必须取决于“ b”。我已经尝试过“ Canvas.itemconfig()”,但是它没有用。

import tkinter
from tkinter import *

root = Tk()

root.maxsize(320,240)       # Sets max size of window
root.minsize(320,240)

canvas_height = 23
canvas_width = 315

w = Canvas(root, width=canvas_width, height=canvas_height)
w.pack()
w.create_rectangle(5, canvas_height, canvas_width, 2, fill="yellow")
w.create_rectangle(5, canvas_height, canvas_width, 2, fill="blue")

a = 1.0 # More complicated code creates this float between 0.00 and 1.00. It is a percentage of the desired 'blue rectangle' width
b = int(a * canvas_width)

root.mainloop() 
Run Code Online (Sandbox Code Playgroud)

如果有人可以提供帮助,我将不胜感激!

附言:我是Stackoverflow社区的新手,所以请让我知道我有什么办法可以使我的问题更容易回答。

python tkinter tkinter-canvas

3
推荐指数
1
解决办法
5456
查看次数

tkinter画布窗口大小

我需要知道什么时候调整画布大小(例如,当主框架最大化时)新的Canvas窗口大小.不幸的是,如果我尝试self.canvas ['width'],我似乎总是回到它初始化时的宽度,而不是当前的宽度.如何获取当前的Canvas窗口尺寸?

tkinter python-3.x tkinter-canvas

3
推荐指数
1
解决办法
5385
查看次数

无法将 tkinter 窗口标题从“tk”更改为

我认为更改窗口标题的行是:

tk=Tk()

tk.title="my title"
Run Code Online (Sandbox Code Playgroud)

但我无法在代码中更改标题:

def welcome_screen():
    #creates the login window
    window = Tk()
    window.title = "Login Screen"
    window.geometry("960x540+450+250")
    canvas = Canvas(window, width=960, height=540, bd=10, bg='#494949')
    canvas.pack()
    window.mainloop()

welcome_screen()
Run Code Online (Sandbox Code Playgroud)

标题应该更改为“登录屏幕”,但运行时它只会显示“tk”。其他一切都按预期进行。

python tkinter python-3.x tkinter-canvas

3
推荐指数
1
解决办法
2280
查看次数