import tkinter as tk
import random
from tkinter import Menu
class DigitalPainter:
def __init__(self, root):
self.root = root
self.root.title("增强版数字画图程序")
self.root.geometry("800x800")
self.color_map = {
'1': '#FF0000', '2': '#00FF00', '3': '#FFFF00',
'4': '#0000FF', '5': '#800080', '6': '#00FFFF',
'7': '#000000', '0': '#FFFFFF'
}
self.create_widgets()
self.bind_events()
def create_widgets(self):
self.text = tk.Text(self.root, font=('Arial', 12), wrap=tk.WORD)
self.text.place(x=220, y=880, width=600, height=330)
self.random_btn = tk.Button(
self.root,
text="生成随机图案",
command=self.generate_and_draw,
font=('Arial', 12)
)
self.random_btn.place(x=230, y=1420, width=520, height=90)
self.canvas = tk.Canvas(self.root, bg='white', bd=1, relief='solid')
self.canvas.place(x=160, y=260, width=760, height=500)
self.context_menu = Menu(self.root, tearoff=0)
self.context_menu.add_command(label="全选", command=self.select_all)
self.context_menu.add_separator()
self.context_menu.add_command(label="复制", command=self.copy_text)
self.context_menu.add_command(label="粘贴", command=self.paste_text)
self.context_menu.add_command(label="删除", command=self.delete_text)
def bind_events(self):
self.text.bind('<KeyRelease>', self.automatic_draw)
self.text.bind('<Button-3>', self.show_context_menu)
def automatic_draw(self, event):
self.canvas.delete('all')
input_str = self.text.get("1.0", tk.END).strip()
self.draw_pattern(input_str)
def generate_and_draw(self):
pattern = self.generate_random_pattern()
self.text.delete("1.0", tk.END)
self.text.insert(tk.END, pattern)
self.automatic_draw(None)
def draw_pattern(self, input_str):
x, y = 10, 10
block_size = 20
for char in input_str:
if char == '\n':
x = 10
y += block_size + 3
continue
if char == '/':
x = 10
y += block_size + 3
continue
color = self.color_map.get(char, '#D0D0D0')
self.canvas.create_rectangle(
x, y, x+block_size, y+block_size,
fill=color, outline='#CCC', width=1
)
x += block_size + 3
if x + block_size > 760 - 10:
x = 10
y += block_size + 3
def generate_random_pattern(self):
chars = ['0', '1', '2', '3', '4', '5', '6', '7', '/']
pattern = []
for _ in range(random.randint(200, 400)):
if random.random() < 0.08:
pattern.append('/')
else:
pattern.append(random.choice(chars[:8]))
return ''.join(pattern)
def show_context_menu(self, event):
self.context_menu.post(event.x_root, event.y_root)
def select_all(self):
self.text.tag_add(tk.SEL, "1.0", tk.END)
def copy_text(self):
self.root.clipboard_clear()
selected_text = self.text.selection_get()
self.root.clipboard_append(selected_text)
def paste_text(self):
clipboard_text = self.root.clipboard_get()
self.text.insert(tk.INSERT, clipboard_text)
def delete_text(self):
self.text.delete(tk.SEL_FIRST, tk.SEL_LAST) if self.text.selection_get() else None
if __name__ == "__main__":
root = tk.Tk()
app = DigitalPainter(root)
root.mainloop()