Как сделать скриншот всего холста tkinter в формате png или pdf - PullRequest
0 голосов
/ 11 февраля 2019

Я создаю программу, которая разработана ... ну, она разработана для того, чтобы честно создавать персонажей для D & D.(Я - DM, и я целую вечность собираю листы вместе, когда это должно быть простым процессом, когда я знаю, чего я хочу. Этот код в конечном итоге станет частью большой программы, которая упростит этот процесс с часов до минут.Это того стоит. Все части создания персонажа находятся в отдельном коде, но я работал над тем, чтобы открыть лист персонажа, поместить в него все ответы на вопросы и сохранить результаты на потом.печать.обратите внимание, что я на Python3, используя Windows 8, и все мои модули на самом деле установлены pip да.

Я хочу:

  1. Либо открыть изображение PNG (или PDF)

  2. Запишите на него новую информацию

  3. Сохраните вывод как новый файл.

<Обратите внимание, что я НЕ хочу использовать классы или функции в этом вообще.Я хочу все простые вещи, пожалуйста.>

Что я уже могу сделать:

  1. Открыть PNG (но не исходный PDF. Мне пришлось сначала преобразовать его для SOOя не пойду сюда по многим причинам.)

  2. Показать информацию, которую я хочу, в окне холста на изображении.

К сожалению, я не могу сохранить весь холст.Самым близким, что я получил, был ImageGrab, который на самом деле снимал весь монитор компьютера.и, следовательно, только около 500 * 250 пикселей моего холста (верхний угол).

Мне нужно выяснить, что я здесь делаю неправильно.Я отключил некоторый код, чтобы заставить работать мои полосы прокрутки, я вовсе не утверждаю, что это как моя собственная.У меня проблема с сохранением выводов как что-либо, что я могу просмотреть.Я получил файл postscript, который, когда я помещал его обратно в видимое изображение, все еще приводил к частичной привязке всего холста.Мне нужно что-то, что показывает даже те части, на которые нужно пролистать.

Текущий код вызывает какое-то исключение в пакете Tkinter, который я обнаружил в сети только 27 раз в других случаях, ни один из которых не имеет ответа, который действительно относился к моей ошибке.Я посмотрел и посмотрел и очень ценю помощь в том, как решить эту проблему.

from tkinter import *
import tkinter.ttk as ttk
import PIL.Image as Image
import PIL.ImageTk as ImageTk
import PIL.ImageGrab as ImageGrab
import os
#I imported all these PIL sections seperate because importing the whole 
#thing as one, or alltogether on one line caused so many errors in calling     
#the functions. my pc for some reason HATES functions, ive NEVER had much 
#success with them. hence trying to create programs without them.
def on_vertical(event):
    canvas.yview_scroll(-1 * event.delta, 'units')

def on_horizontal(event):
    canvas.xview_scroll(-1 * event.delta, 'units')

root = Tk()
root.title('Your Character Here')
h = Scrollbar(root, orient=HORIZONTAL)
v = Scrollbar(root, orient=VERTICAL)
canvas = Canvas(root, scrollregion=(0, 0, 1275, 4960),
     yscrollcommand=v.set, 
     xscrollcommand=h.set)
h['command'] = canvas.xview
v['command'] = canvas.yview
output = ImageTk.PhotoImage(Image.open('charpg4.png'))
canvas.create_image(0,0,image=output, anchor='nw')
canvas.grid(column=0, row=0, sticky=(N,W,E,S))

canvas.bind_all('<MouseWheel>', on_vertical)
canvas.bind_all('<Shift-MouseWheel>', on_horizontal)

h.grid(column=0, row=1, sticky=(W,E))
v.grid(column=1, row=0, sticky=(N,S))
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

testing=("one", "two", "three", "testing")
canvas.create_text(210,155,fill='black',font='Helvetica 10',
                   text=testing)

canvas.update()
grabcanvas=ImageGrab.grab(bbox=canvas).save("test.png")
ttk.grabcanvas.save("test.png")
#the following code works but apparently takes only a direct screenshot
#ImageGrab.grab().save("test.jpg") 
#--these others have been tried but dont work for me??
#causes an error with bbox and ImageGrab
#self.grabcanvas = ImageGrab.grab(bbox=canvas)
#Causes the save error, says no such option
#ImageGrab.grab(bbox=canvas).save("test.jpg")
#froze and crashed the game, didnt do anything in the end.
#canvas.postscript(file='test.ps', size =(1275, 4960), colormode='gray')
root.mainloop()

Вот ошибка кода, которая возникает.

    Traceback (most recent call last):
  File "C:/Users/Autumn/Documents/programs/tests/dnd game/saving 
output/windowsize 3.py", line 42, in <module>
    grabcanvas=ImageGrab.grab(bbox=canvas).save("test.png")
  File "C:\Program Files (x86)\Python36-32\lib\site- 
   packages\PIL\ImageGrab.py", 
    line 48, in grab
        im = im.crop(bbox)
   File "C:\Program Files (x86)\Python36-32\lib\site- 
 packages\PIL\Image.py", 
    line 1078, in crop
        return self._new(self._crop(self.im, box))
      File "C:\Program Files (x86)\Python36-32\lib\site- 
   packages\PIL\Image.py", 
    line 1092, in _crop
    x0, y0, x1, y1 = map(int, map(round, box))
       File "C:\Program Files (x86)\Python36-32\lib\tkinter\__init__.py", 
line 1486, in cget
        return self.tk.call(self._w, 'cget', '-' + key)
    TypeError: must be str, not int

Обычно я решаю, что не так с моим кодом, но я не могу, основываясь на всем, что я нахожу в Интернете, Image.Save или ImageGrab.save или Image.write ... это должно работать в пределах тк.... кажется, что это относится к функции в tkinter, которая не вызывает 'cget' или какую-то строку ... потому что я никогда не помещал целое число в строку, к которой он относится в любом случае, и я никогда не обрезался, поскольку ошибка относится к.

1 Ответ

0 голосов
/ 11 февраля 2019

Проблема, с которой вы сталкиваетесь, заключается в том, как вы передаете canvas в bbox.grab() нужно взять кортеж координат, а не объект, такой как canvas.

Попробуйте вместо этого:

Удалите это после вызова update():

grabcanvas=ImageGrab.grab(bbox=canvas).save("test.png")
ttk.grabcanvas.save("test.png")

Затем добавьте это после update() вызова:

def save_canvas():
    x = root.winfo_rootx() + canvas.winfo_x()
    y = root.winfo_rooty() + canvas.winfo_y()
    xx = x + canvas.winfo_width()
    yy = y + canvas.winfo_height()
    ImageGrab.grab(bbox=(x, y, xx, yy)).save("test.gif")
root.after(1000, save_canvas)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...