Как я могу напечатать вывод терминала в кадре tkinter в сетке, используя python? - PullRequest
0 голосов
/ 05 апреля 2020

Я написал алгоритм для стиля календаря, который нашел в Интернете. Хотелось бы распечатать алгоритм в окне 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, в которое алгоритм должен печатать но он не будет печатать в окно ТК, и я не получаю сообщение об ошибке. так что в основном алгоритм будет работать и печатать в терминале, но при кодировании для работы в окне 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^

1 Ответ

0 голосов
/ 05 апреля 2020

Я нашел несколько ошибок в вашем коде, к которым я обратился. Надеюсь, это поможет вам продвинуться вперед:

  • Метод make_calendar объявляется дважды. Я удалил второй, так как button2 должен быть создан там, где также создаются другие элементы tk.
  • is_leap задается строка из ввода tk, но для него нужно целое число
  • convert_calendar непосредственно печатает к консоли. это плохо. Я изменил его, чтобы вернуть строку. теперь у нас может быть два метода print_calendar и display_calendar. оба используют результат от calc_calendar.
  • , не знаю, как работает текстовый объект tkinter. Я изменил ваш 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^


Вы захотите добавить полосу прокрутки рядом, так как вы не видите весь текст, хотя:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...