6

PhotoImageオブジェクトを操作する場合:

import tkinter as tk

img = tk.PhotoImage(file="myFile.gif")
for x in range(0,1000):
  for y in range(0,1000):
    img.put("{red}", (x, y))

put操作には非常に長い時間がかかります。これを行うより速い方法はありますか?

4

3 に答える 3

7

バウンディングボックスを使用します。

from Tkinter import *
root = Tk()
label = Label(root)
label.pack()
img = PhotoImage(width=300,height=300)
data = ("{red red red red blue blue blue blue}")
img.put(data, to=(20,20,280,280))
label.config(image=img)
root.mainloop()
于 2012-05-03T01:00:57.503 に答える
4

toコマンドのオプションのパラメータを使用するput()だけで十分であり、複雑な文字列を作成する必要はありません。

import tkinter as tk
root = tk.Tk()

img = tk.PhotoImage(width=1000, height=1000)
data = 'red'
img.put(data, to=(0, 0, 1000, 1000))
label = tk.Label(root, image=img).pack()

root_window.mainloop()

さらなる観察

PhotoImageのドキュメントについてはあまり見つけることができませんでしたが、このtoパラメーターは、標準のループよりもはるかに効率的にデータをスケーリングします。これは、オンラインで適切に文書化されていないように思われる、役立つと思われる情報です。

このパラメーターは、名前が付けられた(公式リスト)、または8ビットの色の16進コードdataであるスペースで区切られた色の値の文字列を受け取ります。文字列は、ピクセルごとに繰り返される色の配列を表します。複数の色の行は中括弧で囲まれ、列はスペースで区切られています。行は同じ数の列/色である必要があります。

acceptable:
3 column 2 row: '{color color color} {color color color}'
1 column 2 row: 'color color', 'color {color}'
1 column 1 row: 'color', '{color}'

unacceptable:
{color color} {color}

スペースを含む名前付きの色を使用する場合は、中括弧で囲む必要があります。すなわち。「{ドジャーブルー}」

上記の動作を説明するためのいくつかの例を次に示します。ここでは、長い文字列が必要になります。

img = tk.PhotoImage(width=80, height=80)
data = ('{{{}{}}} '.format('{dodger blue} ' * 20, '#ff0000 ' * 20) * 20 +
        '{{{}{}}} '.format('LightGoldenrod ' * 20, 'green ' * 20) * 20)
img.put(data, to=(0, 0, 80, 80))

ここに画像の説明を入力してください

data = ('{{{}{}}} '.format('{dodger blue} ' * 20, '#ff0000 ' * 10) * 20 +
        '{{{}{}}} '.format('LightGoldenrod ' * 20, 'green ' * 10) * 10)

ここに画像の説明を入力してください

于 2018-08-23T22:19:01.263 に答える
2

色の2D配列を作成putし、その配列をパラメーターとして呼び出してみてください。

このような:

import tkinter as tk

img = tk.PhotoImage(file="myFile.gif")
# "#%02x%02x%02x" % (255,0,0) means 'red'
line = '{' + ' '.join(["#%02x%02x%02x" % (255,0,0)] * 1000) + '}'
img.put(' '.join([line] * 1000))
于 2012-05-02T17:20:16.447 に答える