python - 如何使用 python 将终端输出打印到网格中的 tkinter 帧?
问题描述
我已经为我在网上找到的日历样式编写了一个算法。我希望它在输入一年后单击按钮在 tk 窗口中打印算法。不幸的是它不会。我单独使用这个代码测试了算法,这个代码作为算法的测试实现。该算法将通过输入“Mer”和诸如“2020”之类的年份打印到终端,但该算法不会在与终端相同的网格中打印到 tkinter。它根本不会打印到 tkinter 窗口,也没有错误消息,所以我不确定接下来要尝试什么。
def make_calendar(year, start_day):
tup = [('Early Winter', range(1, 37, + 1)),
('Mid Winter 37,', range(37, 1, + 1)),
('Late Winter ', range(38, 71, + 1)),
('Leap Day ', range(70, 69 + 1)),#tup[3] is this line i need to delete if not leap year
('Late Winter ', range(71, 74, + 1)),
('Early Spring ', range(1, 37, + 1)),
('Mid Spring 37,', range(37, 1, +1)),
('Late Spring ', range(38, 74, + 1)),
('Early Summer ', range(1, 37, + 1)),
('Mid Summer 37,', range(37, 1, +1)),
('Late Summer ', range(38, 74, + 1)),
('Early Autumn ', range(1, 37, + 1)),
('Mid Autumn 37,', range(37, 1, +1)),
('Late Autumn ', range(38, 74, + 1)),
('Early Fall ', range(1, 37, + 1)),
('Mid Fall 37, ', range(37, 1, +1)),
('Late Fall ', range(38, 74, + 1))];
week = ['Mer', 'Ven', 'Ear', 'Mar', 'Jup', 'Sat', 'Ura', 'Nep', 'Plu']
start_pos = week.index(start_day)
def is_leap(year):
if (not year%4 and year%100 or not year%400): # algorithm to determine leap year
return True
if not is_leap(year):
del tup[3]
for month, days in tup:
# Print month title
print('{0} {1}'.format(month, year).center(20, ' '))
# Print Day headings
print(''.join(['{0:<3}'.format(w) for w in week]))
# Add spacing for non-zero starting position
print('{0:<3}'.format('')*start_pos, end='')
for day in days:
# Print day
print('{0!s:<3}'.format(day), end='')
start_pos += 1
if start_pos == 9:
# If start_pos == 9 (Sunday) start new line
print()
start_pos = 0 # Reset counter
print('\n')
start_day=(input('Enter start day of the year Mer,Ven,Ear,Mar,Jup,Sat,Ura,Nep,Plu'))
year=int(input('Enter Year'))
make_calendar(year, start_day)
在这里,我设计了一个算法应该打印到的 tkinter 窗口,但它不会打印到 tk 窗口,并且我没有收到任何错误消息。所以基本上该算法将在终端中工作和打印,但是当编码为在 tkinter 窗口中工作时,它什么也不返回。如果算法不会打印到它,我创建的小部件将毫无用处。我已经测试了算法并且它有效。我已经测试了 tkinter 按钮,但它们似乎无法打印。我不知道如何解决这个问题。
import tkinter as tk
#varContent = inputentry.get() # get what's written in the inputentry entry widget
#outputtext.delete('0', 'end-1c') # clear the outputtext text widget
#outputtext.insert(varContent) # print content
#these functions may be relevant to the solution I cannot figure out their implementation in this code.
HEIGHT = 700
WIDTH = 800
root = tk.Tk() #APPLICATION IS BETWEEN THIS LINE DOWN
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
frame = tk.Frame(root, bg='#80c1ff', bd='5')
frame.place(relx=0.5, rely=0.1, relwidth=0.75, relheight=0.1, anchor='n')
button = tk.Button(frame, text="Display Calendar", command=lambda: make_calendar(entry.get()))
button.grid(row=0, column=2)#this makes the buton apear in a grid
label = tk.Label(frame, text="Enter the year")
label.grid(row=0, column=0)#this makes the label apear in a grid
entry = tk.Entry(frame)
entry.grid(row=0, column=1)#this makes the entry apear in a grid
lower_frame = tk.Frame(root, bg='#80c1ff', bd='5')
lower_frame.place(relx=0.5, rely=0.25, relwidth=0.75, relheight=0.6, anchor='n')
lower_label = tk.Text(lower_frame)
lower_label.place(relwidth=1, relheight=1)#this makes the label apear in a grid
year=entry.get
def make_calendar(year):
tup = [('Early Winter', range(1, 37, + 1)),
('Mid Winter 37,', range(37, 1, + 1)),
('Late Winter ', range(38, 71, + 1)),
('Leap Day ', range(70, 69 + 1)),#tup[3] is this line i need to delete if not leap year
('Late Winter ', range(71, 74, + 1)),
('Early Spring ', range(1, 37, + 1)),
('Mid Spring 37,', range(37, 1, +1)),
('Late Spring ', range(38, 74, + 1)),
('Early Summer ', range(1, 37, + 1)),
('Mid Summer 37,', range(37, 1, +1)),
('Late Summer ', range(38, 74, + 1)),
('Early Autumn ', range(1, 37, + 1)),
('Mid Autumn 37,', range(37, 1, +1)),
('Late Autumn ', range(38, 74, + 1)),
('Early Fall ', range(1, 37, + 1)),
('Mid Fall 37, ', range(37, 1, +1)),
('Late Fall ', range(38, 74, + 1))];
week = ['Mer ', 'Ven ', 'Ear ', 'Mar ', 'Jup ', 'Sat ', 'Ura ', 'Nep ', 'Plu ']
start_pos = week.index('Mer ')
def is_leap(year):
if (not year%4 and year%100 or not year%400): # algorithm to determine leap year
return True
if not is_leap(year):
del tup[3]
for month, days in tup:
# Print month title
print('{0} {1}'.format(month, year).center(20, ' '))
# Print Day headings
print(''.join(['{0:<3}'.format(w) for w in week]))
# Add spacing for non-zero starting position
print('{0:<3}'.format('')*start_pos, end='')
for day in days:
# Print day
print('{0!s:<6}'.format(day), end='')
start_pos += 1
if start_pos == 9:
# If start_pos == 9 (Sunday) start new line
print()
start_pos = 0 # Reset counter
def make_calendar(year):
button2 = tk.Button(frame, text="Print Calendar", function=print('\n'))
button2.grid(row=0, column=5)#this makes the buton apear in a grid
start_day=('Mer ')
make_calendar(year)
root.mainloop()#APPLICATION IS BETWEEN THIS LINE^
解决方案
我在您的代码中发现了一些我解决的错误。希望这将帮助您前进:
- make_calendar 方法被声明了两次。我删除了第二个,因为应该在创建其他 tk 元素的地方创建 button2。
- is_leap 从 tk 输入中得到一个字符串,但它需要一个整数
- calculate_calendar 直接打印到控制台。那很不好。我将其更改为返回一个字符串。现在我们可以有两个方法 print_calendar 和 display_calendar。两者都使用calculate_calendar 的结果。
- 不确定 tkinter Text 对象是如何工作的。我将您的 lower_label 更改为 tk.Label,现在我可以更新内容了。
以下代码对我有用 - 它在 TK 标签中显示正确的内容,并且可以打印到控制台。
import tkinter as tk
# varContent = inputentry.get() # get what's written in the inputentry entry widget
# outputtext.delete('0', 'end-1c') # clear the outputtext text widget
# outputtext.insert(varContent) # print content
# these functions may be relevant to the solution I cannot figure out their implementation in this code.
from tkinter import END
HEIGHT = 700
WIDTH = 800
root = tk.Tk() # APPLICATION IS BETWEEN THIS LINE DOWN
canvas = tk.Canvas(root, height=HEIGHT, width=WIDTH)
canvas.pack()
frame = tk.Frame(root, bg='#80c1ff', bd='5')
frame.place(relx=0.5, rely=0.1, relwidth=0.75, relheight=0.1, anchor='n')
button = tk.Button(frame, text="Display Calendar", command=lambda: display_calendar(entry.get()))
button.grid(row=0, column=2) # this makes the buton apear in a grid
button2 = tk.Button(frame, text="Print Calendar", command=lambda: print_calendar(entry.get()))
button2.grid(row=0, column=5) # this makes the buton apear in a grid
label = tk.Label(frame, text="Enter the year")
label.grid(row=0, column=0) # this makes the label apear in a grid
entry = tk.Entry(frame)
entry.grid(row=0, column=1) # this makes the entry apear in a grid
lower_frame = tk.Frame(root, bg='#80c1ff', bd='5')
lower_frame.place(relx=0.5, rely=0.25, relwidth=0.75, relheight=0.6, anchor='n')
lower_label = tk.Label(lower_frame)
lower_label.place(relwidth=1, relheight=1) # this makes the label apear in a grid
year = entry.get
def print_calendar(year):
calendar = calculate_calendar(year)
print(calendar)
def display_calendar(year):
calendar = calculate_calendar(year)
lower_label.config(text=calendar)
def calculate_calendar(year):
result = ""
tup = [('Early Winter', range(1, 37, + 1)),
('Mid Winter 37,', range(37, 1, + 1)),
('Late Winter ', range(38, 71, + 1)),
('Leap Day ', range(70, 69 + 1)), # tup[3] is this line i need to delete if not leap year
('Late Winter ', range(71, 74, + 1)),
('Early Spring ', range(1, 37, + 1)),
('Mid Spring 37,', range(37, 1, +1)),
('Late Spring ', range(38, 74, + 1)),
('Early Summer ', range(1, 37, + 1)),
('Mid Summer 37,', range(37, 1, +1)),
('Late Summer ', range(38, 74, + 1)),
('Early Autumn ', range(1, 37, + 1)),
('Mid Autumn 37,', range(37, 1, +1)),
('Late Autumn ', range(38, 74, + 1)),
('Early Fall ', range(1, 37, + 1)),
('Mid Fall 37, ', range(37, 1, +1)),
('Late Fall ', range(38, 74, + 1))]
week = ['Mer ', 'Ven ', 'Ear ', 'Mar ', 'Jup ', 'Sat ', 'Ura ', 'Nep ', 'Plu ']
start_pos = week.index('Mer ')
def is_leap(year):
year = int(year)
if not year % 4 and year % 100 or not year % 400: # algorithm to determine leap year
return True
if not is_leap(year):
del tup[3]
for month, days in tup:
# Print month title
result += '{0} {1}\n'.format(month, year).center(20, ' ')
# Print Day headings
result += ''.join(['{0:<3}'.format(w) for w in week]) + "\n"
# Add spacing for non-zero starting position
result += '{0:<3}'.format('') * start_pos
for day in days:
# Print day
result += '{0!s:<6}'.format(day)
start_pos += 1
if start_pos == 9:
# If start_pos == 9 (Sunday) start new line
result += "\n"
start_pos = 0 # Reset counter
return result
start_day = ('Mer ')
root.mainloop() # APPLICATION IS BETWEEN THIS LINE^
接下来您需要添加一个滚动条,因为您无法看到整个文本:)
推荐阅读
- ruby - 如何实现getter setter方法来更改动态方法中的键值?
- sql-server - 使用具有 db_datareader 数据库角色的 SQL Server 帐户获取与特定数据库的当前连接数
- c++ - 父类有 26 个构造函数重载。如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造函数?
- jquery - 选择文本输入上的标签,但在不更改文本值的情况下发布值
- javascript - JavaScript:Jest 无法识别静态函数
- python - Scrapyd - 作为蜘蛛参数传递时的 URL 解析问题
- python - 在 tensorflow-2.0 beta 中绘制子类模型
- c - LeetCode:两个和(错误:返回数组)
- python-3.x - 用于 Python 的 Bing 图像搜索 SDK:获取“权限被拒绝”
- c++ - 使用 glDrawElementsInstanced 进行实例渲染时的行为不一致,有时没有渲染且没有错误