Форум программистов, компьютерный форум, киберфорум
Python: Tkinter
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 15.12.2020
Сообщений: 1

Кроссворд через tkinter

15.12.2020, 00:41. Показов 1390. Ответов 0

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Очень нужна помощь
У меня имеется код, который в консоли выводит заполненный кроссворд, при чем каждый раз пересечения слов случайны.
Может кто-то подсказать, как дополнить данный код с помощью библиотеки tkinter, чтобы этот же случайный кроссворд выводился в отдельном окне. Буду очень признателен.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
import sys, io, os
 
import random, time
from operator import itemgetter
from collections import defaultdict
 
class Crossword:
    def __init__(self, rows, cols, empty=' ', available_words=[]):
        self.rows = rows
        self.cols = cols
        self.empty = empty
        self.available_words = available_words
        self.let_coords = defaultdict(list)
 
    def prep_grid_words(self):
        self.current_wordlist = []
        self.let_coords.clear()
        self.grid = [[self.empty]*self.cols for i in range(self.rows)]
        self.available_words = [word[:2] for word in self.available_words]
        self.first_word(self.available_words[0])
 
    def compute_crossword(self, time_permitted=1.00):
        self.best_wordlist = []
        wordlist_length = len(self.available_words)
        time_permitted = float(time_permitted)
        start_full = float(time.time())
        while (float(time.time()) - start_full) < time_permitted:
            self.prep_grid_words()
            [self.add_words(word) for i in range(2) for word in self.available_words
             if word not in self.current_wordlist]
            if len(self.current_wordlist) > len(self.best_wordlist):
                self.best_wordlist = list(self.current_wordlist)
                self.best_grid = list(self.grid)
            if len(self.best_wordlist) == wordlist_length:
                break
        #answer = '\n'.join([''.join(['{} '.format(c) for c in self.best_grid[r]]) for r in range(self.rows)])
        answer = '\n'.join([''.join([u'{} '.format(c) for c in self.best_grid[r]])
                            for r in range(self.rows)])
        return answer + '\n\n' + str(len(self.best_wordlist)) + ' out of ' + str(wordlist_length)
 
    def get_coords(self, word):
        """Return possible coordinates for each letter."""
        word_length = len(word[0])
        coordlist = []
        temp_list =  [(l, v) for l, letter in enumerate(word[0])
                      for k, v in self.let_coords.items() if k == letter]
        for coord in temp_list:
            letc = coord[0]
            for item in coord[1]:
                (rowc, colc, vertc) = item
                if vertc:
                    if colc - letc >= 0 and (colc - letc) + word_length <= self.cols:
                        row, col = (rowc, colc - letc)
                        score = self.check_score_horiz(word, row, col, word_length)
                        if score:
                            coordlist.append([rowc, colc - letc, 0, score])
                else:
                    if rowc - letc >= 0 and (rowc - letc) + word_length <= self.rows:
                        row, col = (rowc - letc, colc)
                        score = self.check_score_vert(word, row, col, word_length)
                        if score:
                            coordlist.append([rowc - letc, colc, 1, score])
        if coordlist:
            return max(coordlist, key=itemgetter(3))
        else:
            return
 
    def first_word(self, word):
        """Place the first word at a random position in the grid."""
        vertical = random.randrange(0, 2)
        if vertical:
            row = random.randrange(0, self.rows - len(word[0]))
            col = random.randrange(0, self.cols)
        else:
            row = random.randrange(0, self.rows)
            col = random.randrange(0, self.cols - len(word[0]))
        self.set_word(word, row, col, vertical)
 
    def add_words(self, word):
        """Add the rest of the words to the grid."""
        coordlist = self.get_coords(word)
        if not coordlist:
            return
        row, col, vertical = coordlist[0], coordlist[1], coordlist[2]
        self.set_word(word, row, col, vertical)
 
    def check_score_horiz(self, word, row, col, word_length, score=1):
        cell_occupied = self.cell_occupied
        if col and cell_occupied(row, col-1) or col + word_length != self.cols and cell_occupied(row, col + word_length):
            return 0
        if row and (not cell_occupied(row-1, col) and cell_occupied(row, col) and (row+1 == self.rows or cell_occupied(row+1, col))):
            return 0
        if not row and cell_occupied(row, col):
            return 0
        for letter in word[0]:
            active_cell = self.grid[row][col]
            if active_cell == self.empty:
                if row + 1 != self.rows and cell_occupied(row+1, col) or row and cell_occupied(row-1, col):
                    return 0
            elif active_cell == letter:
                score += 1
            else:
                return 0
            col += 1
        return score
 
    def check_score_vert(self, word, row, col, word_length, score=1):
        cell_occupied = self.cell_occupied
        if row and cell_occupied(row-1, col) or row + word_length != self.rows and cell_occupied(row + word_length, col):
            return 0
        if col and (not cell_occupied(row, col-1) and cell_occupied(row, col) and (col+1 == self.cols or cell_occupied(row, col+1))):
            return 0
        if not col and cell_occupied(row, col):
            return 0
        for letter in word[0]:
            active_cell = self.grid[row][col]
            if active_cell == self.empty:
                if col + 1 != self.cols and cell_occupied(row, col+1) or col and cell_occupied(row, col-1):
                    return 0
            elif active_cell == letter:
                score += 1
            else:
                return 0
            row += 1
        return score
 
    def set_word(self, word, row, col, vertical):
        """Put words on the grid and add them to the word list."""
        word.extend([row, col, vertical])
        self.current_wordlist.append(word)
 
        horizontal = not vertical
        for letter in word[0]:
            self.grid[row][col] = letter
            if (row, col, horizontal) not in self.let_coords[letter]:
                self.let_coords[letter].append((row, col, vertical))
            else:
                self.let_coords[letter].remove((row, col, horizontal))
            if vertical:
                row += 1
            else:
                col += 1
 
    def cell_occupied(self, row, col):
        cell = self.grid[row][col]
        if cell == self.empty:
            return False
        else:
            return True
 
def crossword2tex(nrow, ncol, words):
    new_grid = [ [ '{} ' for _ in range(ncol) ] for _ in range(nrow) ]
    clues_across, clues_down = [], []
    for i, word in enumerate(words):
        r, c, v = words[i][2:]
        for j in range(len(words[i][0])):
            new_grid[r+v*j][c+(1-v)*j] = words[i][0][j].upper()
        if v == 0:
            clues_across.append( '\\Clue{{{0}}}{{{1}}}{{{2}}}'.format(i+1,words[i][0].upper(),words[i][1]) )
        else:
            clues_down.append( '\\Clue{{{0}}}{{{1}}}{{{2}}}'.format(i+1,words[i][0].upper(),words[i][1]) )
    for i, word in enumerate(words):
        r, c, v = words[i][2:]
        if new_grid[r][c][0] != '[':
            new_grid[r][c] = '[{0}]{1}'.format(i+1, new_grid[r][c])
    for r in range(nrow):
        for c in range(ncol):
            if r > 0 and r < nrow-1 and c > 0 and c < ncol-1:
                if new_grid[r][c][0] == '{' and new_grid[r-1][c][0] not in ['{','*']\
                    and new_grid[r+1][c][0] not in ['{','*'] and new_grid[r][c-1][0] not in ['{','*']\
                    and new_grid[r][c+1][0] not in ['{','*']:
                    new_grid[r][c] = '*  '
    text = '|' + '|.\n|'.join( [ '|'.join(line) for line in new_grid ] ) + '|.'
    return text, clues_across, clues_down
 
 
 
if __name__ == "__main__":
    ncol, nrow = 30, 30
    wordlist = [[line.split(':')[0].upper(), line.split(':')[1]] for line in open('words.txt').read().splitlines()]
    wordlist = wordlist[:]
    cw = Crossword(nrow, ncol, ' ', wordlist)
    print(cw.compute_crossword())
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.12.2020, 00:41
Ответы с готовыми решениями:

Загрузка xlsx через Tkinter
Добрый день! Подскажите пожалуйста, есть код на tkinter который открываем Excel файл, дальше мне этот файл(путь) нужно использовать...

Компиляция проекта с tkinter через pyinstaller
Имеется приложение написанное на Python 3 с интерфейсом на tkinter. Пытаюсь скомпилировать через Pyinstaller. Для этого в cmd перехожу в...

Как делать меню через tkinter
Я не умею делать меню через tkinter, а интернете ничего такого нет, можете пояснить, как это надо делать?

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.12.2020, 00:41
Помогаю со студенческими работами здесь

Как сделать так, чтобы при использовании модуля из tkinter не открывалось окно tkinter?
Как сделать так, чтобы при использовании модуля из tkinter не открывалось окно tkinter? Я пишу приложение на kivy но использую ...

Виджеты tkinter и tkinter.ttk (используется Python 3.5.2)
1) Проблема с виджетом Scale (ползунок) модуля tkinter. Я создал ползунок от 1 до 50 (как на первой картинке). По умолчанию стоит на 1....

Ошибка при попытке открыть программу через консоль, import tkinter as tk ModuleNotFoundError: No module named 'tkinter'
import tkinter as tk ModuleNotFoundError: No module named 'tkinter' Пытаюсь открыть через py main.py, находясь в директории проекта ...

Копирование элементов через перетаскивание (tkinter)
Необходимо создать фиксированный объект, который будет копироваться если потянуть за него. Перемещение происходит следующим образом: ...

Как сделать окно tkinter неактивным по нажатии на него. Оверлей на Tkinter
Здравствуйте. Пытаюсь сделать оверлей на tkinter, поскольку многие модули из интернета нерабочее на моем ПК. Уже все готово, кроме одной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru