Если вы просто запустите одновременно "интерфейс" и скрипт, вы никак не сможете обмениваться данными между ними. Это будут два независимых скрипта, исполняемых параллельно. Для реализации программ, использующих графические интерфейсы пользователя, обычно используют ОО-стиль, и основное окно приложения описывается классом, наследующим какой либо графический элемент (в tkinter чаще всего наследуются либо от tkinter.Frame, либо от базового класса tkinter.Tk). В таком классе вы без проблем сможете описать методы, выполняющие различные действия (для работы с интернетом используйте потоки или asyncio, иначе окно приложения будет зависать), и из которых будут доступны все элементы GUI, если те являются атрибутами вашего класса.
В качестве примера такой реализации приведу вам код, который я когда то давно писал. Из него вы сможете понять один из шаблонов создания приложений с граф. интерфейсом на базе ОО и библиотеки tkinter. Суть этого приложения была проста донельзя - оно просто рисовало беспорядочные треугольники внутри графического окна. К вашему сожалению, приложения с GUI, делающие что либо более полезное, я просто так, на всеобщее обозрение, кидать не буду.
Ну, условие крайне странное, я понимаю так, что числовой промежуток дан в 10тичной системе счисления, и каждое целое число на промежутке необходимо перевести в 16ричное. Если промежуток [28; 30], то это означает что туда входят такие целые числа как 28, 29, 30 (если промежуток обозначается квадратными скобками '[' и ']', то это включая числа что указаны его границами, если же круглыми '(' и ')', то не включая их.
Перейдем к переводу десятичных чисел в шестнадцатиричную систему счислени. Для этого делем число на 16, паралельно записывая его остаток и продолжая до тех пор, пока оно не станет меньше 16. 28 / 16 = 1; остаток 12
Тут ничего сложного, пользуемся табличкой переводов, смотрим, 12 из десятичной в 16ричной это буква C, а 1 оставляем как есть. Теперь запишим полученные числа: 1C - Это 28 в 16ричной
Точно так же переводим из 10тичной в 16ричную 29: 29/16 = 1; остаток 13 Получается 1D
Ну и как не трудно догадаться, 30 в 16ричной будет 1E. Но для наглядности проведем расчёты: 30/16=1; остаток 14
Постскриптум: — Задание сформулированно крайне не понятно и вот почему: Нижним индексом, по обыкновению, указывают систему счисления текущего числа, но тогда нет никакого смысла переводить в 16ричную систему из 16ричной. — Другой вариант, что 28 и 30 это числа указанные не в 16ричной, но они могут быть в любой системе счисления где больше 8 цифр :)
Если предерживаться первого предположения, то нужно просто записать все цифры 16ричной системы счисления от 28 до 30 включительно, тогда это будет: 28, 29, 30 Что вообще смысла не имеет, так что не претендую на идеально правильное решение, но это единственное адекватное, что пришло мне в голову. Может этот идеотизм как-то и по другому закручен :D
Ну, условие крайне странное, я понимаю так, что числовой промежуток дан в 10тичной системе счисления, и каждое целое число на промежутке необходимо перевести в 16ричное. Если промежуток [28; 30], то это означает что туда входят такие целые числа как 28, 29, 30 (если промежуток обозначается квадратными скобками '[' и ']', то это включая числа что указаны его границами, если же круглыми '(' и ')', то не включая их.
Перейдем к переводу десятичных чисел в шестнадцатиричную систему счислени. Для этого делем число на 16, паралельно записывая его остаток и продолжая до тех пор, пока оно не станет меньше 16. 28 / 16 = 1; остаток 12
Тут ничего сложного, пользуемся табличкой переводов, смотрим, 12 из десятичной в 16ричной это буква C, а 1 оставляем как есть. Теперь запишим полученные числа: 1C - Это 28 в 16ричной
Точно так же переводим из 10тичной в 16ричную 29: 29/16 = 1; остаток 13 Получается 1D
Ну и как не трудно догадаться, 30 в 16ричной будет 1E. Но для наглядности проведем расчёты: 30/16=1; остаток 14
Постскриптум: — Задание сформулированно крайне не понятно и вот почему: Нижним индексом, по обыкновению, указывают систему счисления текущего числа, но тогда нет никакого смысла переводить в 16ричную систему из 16ричной. — Другой вариант, что 28 и 30 это числа указанные не в 16ричной, но они могут быть в любой системе счисления где больше 8 цифр :)
Если предерживаться первого предположения, то нужно просто записать все цифры 16ричной системы счисления от 28 до 30 включительно, тогда это будет: 28, 29, 30 Что вообще смысла не имеет, так что не претендую на идеально правильное решение, но это единственное адекватное, что пришло мне в голову. Может этот идеотизм как-то и по другому закручен :D
Если вы просто запустите одновременно "интерфейс" и скрипт, вы никак не сможете обмениваться данными между ними. Это будут два независимых скрипта, исполняемых параллельно. Для реализации программ, использующих графические интерфейсы пользователя, обычно используют ОО-стиль, и основное окно приложения описывается классом, наследующим какой либо графический элемент (в tkinter чаще всего наследуются либо от tkinter.Frame, либо от базового класса tkinter.Tk). В таком классе вы без проблем сможете описать методы, выполняющие различные действия (для работы с интернетом используйте потоки или asyncio, иначе окно приложения будет зависать), и из которых будут доступны все элементы GUI, если те являются атрибутами вашего класса.
В качестве примера такой реализации приведу вам код, который я когда то давно писал. Из него вы сможете понять один из шаблонов создания приложений с граф. интерфейсом на базе ОО и библиотеки tkinter. Суть этого приложения была проста донельзя - оно просто рисовало беспорядочные треугольники внутри графического окна. К вашему сожалению, приложения с GUI, делающие что либо более полезное, я просто так, на всеобщее обозрение, кидать не буду.
import tkinter as tk
import random
import threading
import time
class TriangleStruct(object):
def __init__(self, fx, fy, sx, sy, thx, thy):
self.leftuppercorner = {'leftupper_x': fx, 'leftupper_y' : fy}
self.secondcorner = {'middle_x': sx, 'middle_y':sy}
self.thirdcorner = {'lower_x' : thx, 'lower_y':thy}
class MainWin(tk.Frame):
def __init__(self, root):
super().__init__(root)
root.bind('<space>', self.pause)
self.avaiable_colors = ['orange', 'red', 'green', 'yellow', 'purple']
self._graphstack_depth = 7
self._graphstack_buffer = []
self.is_run = True
self.build()
def build(self):
self.canv = tk.Canvas(self, width = 640, height = 480)
self.canv.pack()
threading.Thread(target=self.infinity_triangle_drawing).start()
def draw_triangles(self):
for step in range(self._graphstack_depth):
self._graphstack_buffer.append(self.gen_rand_triangle())
for step in range(self._graphstack_depth):
self.canv.create_polygon(
(self._graphstack_buffer[step].leftuppercorner['leftupper_x'], self._graphstack_buffer[step].leftuppercorner['leftupper_y']),
(self._graphstack_buffer[step].secondcorner['middle_x'], self._graphstack_buffer[step].secondcorner['middle_y']),
(self._graphstack_buffer[step].thirdcorner['lower_x'], self._graphstack_buffer[step].thirdcorner['lower_y']),
fill = random.choice(self.avaiable_colors),
outline = 'black'
)
def gen_rand_triangle(self):
firstxpos, firstypos = random.randint(0, 540), random.randint(0, 380)
secxpos, secypos = random.randint(10, 620), random.randint(10, 440)
thirdxpos, thirdypos = random.randint(0, 620), random.randint(20, 440)
return TriangleStruct(firstxpos, firstypos, secxpos, secypos, thirdxpos, thirdypos)
def infinity_triangle_drawing(self):
while True:
if self.is_run:
self.canv.delete('all')
self._graphstack_buffer.clear()
self.draw_triangles()
time.sleep(0.1)
else:
pass
def pause(self, event):
if self.is_run:
self.is_run = False
else:
self.is_run = True
if __name__ == '__main__':
root = tk.Tk()
win = MainWin(root)
win.pack()
root.title('triangles')
root.resizable(False, False)
root.geometry('650x490')
root.mainloop()
Объяснение: