使用Tkinter、矩阵和像素的Python LED板
作为Python项目的一部分,我正在尝试使用Tkinter库制作LED板。该板应接收输入(一句话)并在板上显示。我已经开始为每个字母制作由0和1组成的使用Tkinter、矩阵和像素的Python LED板,python,tkinter,Python,Tkinter,作为Python项目的一部分,我正在尝试使用Tkinter库制作LED板。该板应接收输入(一句话)并在板上显示。我已经开始为每个字母制作由0和1组成的7*6矩阵,但我真的不知道下一步该怎么做,以及这些字母应该如何显示在黑板上 例如: A = [[0, 1, 1, 1, 0, 0], [1, 0, 0, 0, 1, 0], [1, 0, 0, 0, 1, 0], [1, 0, 0, 0, 1, 0], [1, 1, 1, 1, 1, 0],
7*6
矩阵,但我真的不知道下一步该怎么做,以及这些字母应该如何显示在黑板上
例如:
A = [[0, 1, 1, 1, 0, 0],
[1, 0, 0, 0, 1, 0],
[1, 0, 0, 0, 1, 0],
[1, 0, 0, 0, 1, 0],
[1, 1, 1, 1, 1, 0],
[1, 0, 0, 0, 1, 0],
[1, 0, 0, 0, 1, 0]]
字母应如下所示:
示例代码
import tkinter as tk
# Should have constants in another .py or .json file
DOT_WIDTH = 20
DOT_HEIGHT = 20
LETTER_WIDTH = 6 * DOT_WIDTH
LETTER_HEIGHT = 7 * DOT_HEIGHT
LETTERS = { 'A' :
(
(0,1,1,1,0,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,1,1,1,1,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0)
),
'B' :
(
(1,1,1,1,0,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,1,1,1,0,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,1,1,1,1,0)
)
}
class LED(tk.Canvas):
def __init__(self, master):
super().__init__(master, width = 500, height = 300, bg = 'black')
self._cursor_pos = 2
self._line_pos = 2
def draw_letter(self, char):
for i, row in enumerate(LETTERS.get(char, ())):
for j, col in enumerate(row):
if col:
self.create_oval( self._cursor_pos + j * DOT_WIDTH,
self._line_pos + i * DOT_HEIGHT,
self._cursor_pos + (j + 1) * DOT_WIDTH,
self._line_pos + (i + 1) * DOT_HEIGHT,
fill = 'red'
)
self._cursor_pos += LETTER_WIDTH
def new_line(self, size):
if self._cursor_pos + size >= self.winfo_width():
self._cursor_pos = 2
self._line_pos += LETTER_HEIGHT
class App(object):
def __init__(self, master):
self._led = LED(master)
self._led.pack(expand = True, fill = tk.BOTH)
entry = tk.Entry(master)
entry.pack(fill = tk.X)
entry.bind("<Return>", lambda e: self.draw_sentence(entry.get()))
def draw_sentence(self, s):
for word in s.split():
self._led.new_line(len(word) * LETTER_WIDTH)
for char in word:
self._led.draw_letter(char.upper())
self._led._cursor_pos += LETTER_WIDTH//2
if __name__ == '__main__':
root = tk.Tk()
app = App(root)
root.mainloop()
将tkinter作为tk导入
#应在另一个.py或.json文件中包含常量
网点宽度=20
圆点高度=20
字母宽度=6*点宽度
字母高度=7*点高度
字母={A':
(
(0,1,1,1,0,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,1,1,1,1,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0)
),
“B”:
(
(1,1,1,1,0,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,1,1,1,0,0),
(1,0,0,0,1,0),
(1,0,0,0,1,0),
(1,1,1,1,1,0)
)
}
类LED(tk.Canvas):
定义初始(自我,主):
super()。uuuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
自身光标位置=2
自身线路位置=2
def draw_字母(self,char):
对于i,枚举中的行(字母.get(char,()):
对于j,枚举中的列(行):
如果列:
self.create_oval(self._光标_pos+j*点宽度,
自。_线_位置+i*点_高度,
自身光标位置+(j+1)*点宽度,
自身线位置+(i+1)*点高度,
填充=‘红色’
)
自身光标位置+=字母宽度
def新管路(自身,尺寸):
如果self.\u cursor\u pos+size>=self.winfo\u width():
自身光标位置=2
自身线条位置+=字母高度
类应用程序(对象):
定义初始(自我,主):
自发光二极管=发光二极管(主)
self.\u led.pack(expand=True,fill=tk.BOTH)
入口=传统入口(主入口)
入口包装(填充=tk.X)
entry.bind(“,lambda e:self.draw_语句(entry.get()))
def draw_语句(self,s):
对于s.split()中的单词:
自发光二极管新线(长(字)*字母宽度)
对于word中的字符:
self.\u led.绘制字母(char.upper())
自发光二极管光标位置+=字母宽度//2
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=tk.tk()
app=app(根目录)
root.mainloop()
我建议使用字典将字母映射到模式字母={'a':[0,1,1,0,0],…]
并使用画布以create_rectangle
或create_oval
来绘制这些字母。感谢您的回答。您能解释一下有关绘制的更多信息吗迭代给定字符串,然后在画布上绘制这些字母。请原谅我占用您的时间,但您能给我一个示例吗对于其中一个字母。如何在我的画布上绘制它我真的很笨谢谢!你的答案非常有用只是一个问题我不想让这些字母出现在多行中我的下一步是给这些代码添加一些动画,比如从左到右移动,因此所有的字母都必须出现在一行中你有什么建议吗还有动画?这是一个例子。由你来编辑它以适应,我不能为你提供一切。如果你想要动画,我建议你移动每个项目或清理整个画布,然后再重新绘制。非常感谢。你的建议真的帮助了我