tkinter:特定のcanvasに、自作の描画関数をインポートできますか?
解決したいこと
tkinterのcanvasクラス上で、色々な図形を描画・操作しています。ベタ書きのコードだと長くなるので、自作の描画関数をインポートできればコードがスッキリするかと思い試してみましたが、ダメでした。
tkinterにおける関数インポートについてネット上で調べるも、分かりませんでした。解決方法をお願い致します。
発生している問題・エラー
本当は特定のフレーム上にあるcanvasの上にインポートしたかったのですが、まずは、root上で試してみました。関数の外においた定数の扱いがダメなのか。mainloopの使用法がおかしいのか。インポート元の関数に、引数が必要なのか。そもそも、根本的に何か誤解しているのか(これが一番ありうる)、完全に迷子状態です。
該当するソースコード
インポート元の関数:同じディレクトリに置く。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#インポート元:imp_test.py
def rotate():
global canvas
global rad
global WIDTH, HEIGHT, CENTER_X, CENTER_Y, ORBIT_A, SATELITE
global TIME_INTERVAL, RAD_INTERVAL
# 衛星の中心位置を計算
x = CENTER_X + ORBIT_A * math.cos(rad)
y = CENTER_Y + ORBIT_A * math.sin(rad)
# 求めた位置を中心に衛星再配置
canvas.coords("satelite",
x - SATELITE, y - SATELITE,
x + SATELITE, y + SATELITE)
# 衛星を描画する角度を増加
rad += RAD_INTERVAL
if rad > 2*math.pi:
rad -= 2 * math.pi
# TIME_INTERVAL[ms]後に再度rotate実行
after_id = canvas.after(TIME_INTERVAL, rotate)
def main():
global canvas
global rad
global WIDTH, HEIGHT, CENTER_X, CENTER_Y, ORBIT_A, SATELITE
global TIME_INTERVAL, RAD_INTERVAL
canvas = tk.Canvas(root,
width=WIDTH,
height=HEIGHT,
bg="white",
highlightthickness=0)
canvas.pack()
canvas.create_oval(
CENTER_X - PLANET, CENTER_Y - PLANET,
CENTER_X + PLANET, CENTER_Y + PLANET,
tag="planet", fill="green")
canvas.create_oval(
CENTER_X - ORBIT_A, CENTER_Y - ORBIT_A,
CENTER_X + ORBIT_A, CENTER_Y + ORBIT_A,
outline="red", width=5)
# 衛星の中心位置を計算
x = CENTER_X + ORBIT_A * math.cos(rad)
y = CENTER_Y + ORBIT_A * math.sin(rad)
# 衛星を表す円の描画
canvas.create_oval(
x - SATELITE, y - SATELITE,
x + SATELITE, y + SATELITE,
tag="satelite", fill="blue", width=0)
rotate()
インポート先の関数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tkinter as tk
import math
import imp_test
WIDTH = 470
HEIGHT = 320
# 中央座標
CENTER_X = WIDTH // 2
CENTER_Y = HEIGHT // 2
# 軌道のサイズ
ORBIT_A = 140
# 惑星と衛星の半径
PLANET = 100
SATELITE = 20
# 衛星を再配置する時間の間隔
TIME_INTERVAL = 10
# 衛星を再配置する角度の間隔
RAD_INTERVAL = math.pi / 100
# 衛星の回転角度
rad = 0
canvas = None
imp_test.rotate()
imp_test.main()
自分で試したこと
NameError: name 'CENTER_X' is not defined
となりますが、インポート元の関数にはglobal宣言をしています。
とりあえずglobal宣言を増やしましたが、こんなに必要なものでしょうか?