Помогите с GUI приложением на Tkinter

Dany_D

Новичок
Пользователь
Мар 29, 2021
7
0
1
Я скинул много кода(он не полный), но в местах, где следует обратить внимание выделено жирным.
Прошу помогите , подскажите как решить проблему.
У меня при нажати на кнопку "таблица 2", switcher_present = 1 меняется функцией switch_changer_to_2 на значение 2.
Я хочу чтобы все кнопки, все таблицы, для которых я сделал условия, зависящие от switch_present, отрисовались заново.
Русскими словами: при нажатии кнопки таблица 2(таблица 3 , 4, 1) у меня отобразилась вторая(третья, четвертая, первая) таблица и все кнопки, функционал которых будет относиться к своим таблицам.






import tkinter as tk
from tkinter import ttk
import pymysql
from config import host, user, password, db_name


class Main(tk.Frame):

switch_present = 1

def switch_changer_to_1(self):
self.switch_present = 1

print(self.switch_present)
return self.switch_present
def switch_changer_to_2(self):
self.switch_present = 2
print(self.switch_present)
return self.switch_present
def switch_changer_to_3(self):
self.switch_present = 3
print(self.switch_present)
return self.switch_present
def switch_changer_to_4(self):
self.switch_present = 4
print(self.switch_present)
return self.switch_present

def __init__(self, root):
super().__init__(root)
self.init_main()
self.db = db
self.view_records()
def init_main(self):
toolbar = tk.Frame(bg='#d7d8e0', bd=2)
toolbar.pack(side=tk.TOP, fill=tk.X)


self.add_img = tk.PhotoImage(file="add.gif")
if(self.switch_present == 1):
btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0,
compound=tk.TOP, image=self.add_img)
elif(self.switch_present == 2):
btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0,
compound=tk.TOP, image=self.add_img)
elif (self.switch_present == 3):
btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0,
compound=tk.TOP, image=self.add_img)
elif (self.switch_present == 4):
btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0,
compound=tk.TOP, image=self.add_img)
btn_open_dialog.pack(side=tk.LEFT)

# переключение кнопки изменения




#эти самые кнопки
# переключатель таблиц

switcher = tk.Frame(bg='#d7d8e0', bd=2)
switcher.pack(side=tk.TOP, fill=tk.X)

btn_switch_table_1 = tk.Button(switcher, text='таблица 1', command=self.switch_changer_to_1, bg='#d7d8e0', bd=2, compound=tk.TOP)
btn_switch_table_1.pack(side=tk.LEFT)

btn_switch_table_2 = tk.Button(switcher, text='таблица 2', command=self.switch_changer_to_2, bg='#d7d8e0', bd=2, compound=tk.TOP)
btn_switch_table_2.pack(side=tk.LEFT)

btn_switch_table_3 = tk.Button(switcher, text='таблица 3', command=self.switch_changer_to_3, bg='#d7d8e0', bd=2, compound=tk.TOP)
btn_switch_table_3.pack(side=tk.LEFT)

btn_switch_table_4 = tk.Button(switcher, text='таблица 4', command=self.switch_changer_to_4, bg='#d7d8e0', bd=2, compound=tk.TOP)
btn_switch_table_4.pack(side=tk.LEFT)


# переключатель деревьев

if (self.switch_present == 1):
self.tree = ttk.Treeview(self, columns=('ID', 'description', 'costs', 'total'), height=15, show='headings')

self.tree.column('ID', width=30, anchor=tk.CENTER)
self.tree.column('description', width=365, anchor=tk.CENTER)
self.tree.column('costs', width=150, anchor=tk.CENTER)
self.tree.column('total', width=100, anchor=tk.CENTER)

self.tree.heading('ID', text='ID')
self.tree.heading('description', text='Наименование')
self.tree.heading('costs', text='Статья дохода|расхода')
self.tree.heading('total', text='Сумма')

self.tree.pack(side=tk.LEFT)

scroll = tk.Scrollbar(self, command=self.tree.yview)
scroll.pack(side=tk.LEFT, fill=tk.Y)
self.tree.configure(yscrollcommand=scroll.set)

elif(self.switch_present == 2):
self.tree = ttk.Treeview(self, columns=('ID', 'nick_name', 'surename', 'name'), height=15, show='headings')

self.tree.column('ID', width=30, anchor=tk.CENTER)
self.tree.column('nick_name', width=365, anchor=tk.CENTER)
self.tree.column('surename', width=150, anchor=tk.CENTER)
self.tree.column('name', width=150, anchor=tk.CENTER)

self.tree.heading('ID', text='ID')
self.tree.heading('nick_name', text='Никнейм')
self.tree.heading('surename', text='Фамилия')
self.tree.heading('name', text='Имя')

self.tree.pack(side=tk.LEFT)

scroll = tk.Scrollbar(self, command=self.tree.yview)
scroll.pack(side=tk.LEFT, fill=tk.Y)
self.tree.configure(yscrollcommand=scroll.set)


elif (self.switch_present == 3):
self.tree = ttk.Treeview(self, columns=('ID', 'login', 'password'), height=15, show='headings')

self.tree.column('ID', width=30, anchor=tk.CENTER)
self.tree.column('login', width=300, anchor=tk.CENTER)
self.tree.column('password', width=315, anchor=tk.CENTER)


self.tree.heading('ID', text='ID')
self.tree.heading('login', text='Логин')
self.tree.heading('password', text='Пароль')

self.tree.pack(side=tk.LEFT)

scroll = tk.Scrollbar(self, command=self.tree.yview)
scroll.pack(side=tk.LEFT, fill=tk.Y)
self.tree.configure(yscrollcommand=scroll.set)

if (self.switch_present == 4):
self.tree = ttk.Treeview(self, columns=('ID', 'address', 'square', 'tel'), height=15, show='headings')

self.tree.column('ID', width=30, anchor=tk.CENTER)
self.tree.column('address', width=315, anchor=tk.CENTER)
self.tree.column('square', width=100, anchor=tk.CENTER)
self.tree.column('tel', width=200, anchor=tk.CENTER)

self.tree.heading('ID', text='ID')
self.tree.heading('address', text='Адрес')
self.tree.heading('square', text='Площадь склада')
self.tree.heading('tel', text='Телефон склада')

self.tree.pack(side=tk.LEFT)

scroll = tk.Scrollbar(self, command=self.tree.yview)
scroll.pack(side=tk.LEFT, fill=tk.Y)
self.tree.configure(yscrollcommand=scroll.set)






if __name__ == "__main__":
root = tk.Tk()
db = DB()
app = Main(root)
app.pack()
root.title("Домашние финансы")
root.geometry("665x500+300+200")
root.resizable(False, False)
root.mainloop()
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 599
464
83
КАК ты догадался так вставить?!

у тебя есть 2 строки:
[ CODE=python]

[ /CODE]

между ними надо вставить весь код
что вы подчеркнули на скрине, так он вставил...
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
скинь код вот так:
1622986342665.png
 

Dany_D

Новичок
Пользователь
Мар 29, 2021
7
0
1
import tkinter as tk from tkinter import ttk import pymysql from config import host, user, password, db_name class Main(tk.Frame): switch_present = 1 def switch_changer_to_1(self): self.switch_present = 1 print(self.switch_present) return self.switch_present def switch_changer_to_2(self): self.switch_present = 2 print(self.switch_present) return self.switch_present def switch_changer_to_3(self): self.switch_present = 3 print(self.switch_present) return self.switch_present def switch_changer_to_4(self): self.switch_present = 4 print(self.switch_present) return self.switch_present def __init__(self, root): super().__init__(root) self.init_main() self.db = db self.view_records() def init_main(self): toolbar = tk.Frame(bg='#d7d8e0', bd=2) toolbar.pack(side=tk.TOP, fill=tk.X) self.add_img = tk.PhotoImage(file="add.gif") if(self.switch_present == 1): btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0, compound=tk.TOP, image=self.add_img) elif(self.switch_present == 2): btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0, compound=tk.TOP, image=self.add_img) elif (self.switch_present == 3): btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0, compound=tk.TOP, image=self.add_img) elif (self.switch_present == 4): btn_open_dialog = tk.Button(toolbar, text='Добавить позицию', command=self.open_dialog, bg='#d7d8e0', bd=0, compound=tk.TOP, image=self.add_img) btn_open_dialog.pack(side=tk.LEFT) # переключение нопки изменения self.edit_img = tk.PhotoImage(file="update.gif") if (self.switch_present == 1): btn_edit_dialog = tk.Button(toolbar, text='Аедактировать', bg='#d7d8e0', bd=0, command=self.open_update_dialog, image=self.edit_img, compound=tk.TOP) elif (self.switch_present == 2): btn_edit_dialog = tk.Button(toolbar, text='Бедактировать', bg='#d7d8e0', bd=0, command=self.open_update_dialog, image=self.edit_img, compound=tk.TOP) elif (self.switch_present == 3): btn_edit_dialog = tk.Button(toolbar, text='Ведактировать', bg='#d7d8e0', bd=0, command=self.open_update_dialog, image=self.edit_img, compound=tk.TOP) elif (self.switch_present == 4): btn_edit_dialog = tk.Button(toolbar, text='Гедактировать', bg='#d7d8e0', bd=0, command=self.open_update_dialog, image=self.edit_img, compound=tk.TOP) btn_edit_dialog.pack(side=tk.LEFT) # переключение кнопки удаления self.delete_img = tk.PhotoImage(file="delete.gif") if (self.switch_present == 1): btn_delete_records = tk.Button(toolbar, text='Удаление записей', bg='#d7d8e0', bd=0, command=self.delete_records, image=self.delete_img, compound=tk.TOP) elif (self.switch_present == 2): btn_delete_records = tk.Button(toolbar, text='Удаение записей', bg='#d7d8e0', bd=0, command=self.delete_records, image=self.delete_img, compound=tk.TOP) elif (self.switch_present == 3): btn_delete_records = tk.Button(toolbar, text='Удаление записей', bg='#d7d8e0', bd=0, command=self.delete_records, image=self.delete_img, compound=tk.TOP) elif (self.switch_present == 4): btn_delete_records = tk.Button(toolbar, text='Удаление записей', bg='#d7d8e0', bd=0, command=self.delete_records, image=self.delete_img, compound=tk.TOP) btn_delete_records.pack(side=tk.LEFT) # переключение кнопки поиска if (self.switch_present == 1): self.search_img = tk.PhotoImage(file="search.gif") btn_search_dialog = tk.Button(toolbar, text='Поиск', bg='#d7d8e0', bd=0, command=self.search_dialog, compound=tk.TOP, image=self.search_img) elif (self.switch_present == 2): self.search_img = tk.PhotoImage(file="search.gif") btn_search_dialog = tk.Button(toolbar, text='Поиск', bg='#d7d8e0', bd=0, command=self.search_dialog, compound=tk.TOP, image=self.search_img) elif (self.switch_present == 3): self.search_img = tk.PhotoImage(file="search.gif") btn_search_dialog = tk.Button(toolbar, text='Поиск', bg='#d7d8e0', bd=0, command=self.search_dialog, compound=tk.TOP, image=self.search_img) elif (self.switch_present == 4): self.search_img = tk.PhotoImage(file="search.gif") btn_search_dialog = tk.Button(toolbar, text='Поиск', bg='#d7d8e0', bd=0, command=self.search_dialog, compound=tk.TOP, image=self.search_img) btn_search_dialog.pack(side=tk.LEFT) # переключение кнопки обновления self.refresh_img = tk.PhotoImage(file="refresh.gif") if(self.switch_present == 1): btn_refresh_dialog = tk.Button(toolbar, text='Обновить', bg='#d7d8e0', bd=0, command=self.view_records, compound=tk.TOP, image=self.refresh_img) elif(self.switch_present == 2): btn_refresh_dialog = tk.Button(toolbar, text='Обновить', bg='#d7d8e0', bd=0, command=self.view_records, compound=tk.TOP, image=self.refresh_img) elif (self.switch_present == 3): btn_refresh_dialog = tk.Button(toolbar, text='Обновить', bg='#d7d8e0', bd=0, command=self.view_records, compound=tk.TOP, image=self.refresh_img) elif (self.switch_present == 4): btn_refresh_dialog = tk.Button(toolbar, text='Обновить', bg='#d7d8e0', bd=0, command=self.view_records, compound=tk.TOP, image=self.refresh_img) btn_refresh_dialog.pack(side=tk.LEFT)
 

Dany_D

Новичок
Пользователь
Мар 29, 2021
7
0
1
# переключатель таблиц switcher = tk.Frame(bg='#d7d8e0', bd=2) switcher.pack(side=tk.TOP, fill=tk.X) btn_switch_table_1 = tk.Button(switcher, text='таблица 1', command=self.switch_changer_to_1, bg='#d7d8e0', bd=2, compound=tk.TOP) btn_switch_table_1.pack(side=tk.LEFT) btn_switch_table_2 = tk.Button(switcher, text='таблица 2', command=self.switch_changer_to_2, bg='#d7d8e0', bd=2, compound=tk.TOP) btn_switch_table_2.pack(side=tk.LEFT) btn_switch_table_3 = tk.Button(switcher, text='таблица 3', command=self.switch_changer_to_3, bg='#d7d8e0', bd=2, compound=tk.TOP) btn_switch_table_3.pack(side=tk.LEFT) btn_switch_table_4 = tk.Button(switcher, text='таблица 4', command=self.switch_changer_to_4, bg='#d7d8e0', bd=2, compound=tk.TOP) btn_switch_table_4.pack(side=tk.LEFT) # переключатель деревьев if (self.switch_present == 1): self.tree = ttk.Treeview(self, columns=('ID', 'description', 'costs', 'total'), height=15, show='headings') self.tree.column('ID', width=30, anchor=tk.CENTER) self.tree.column('description', width=365, anchor=tk.CENTER) self.tree.column('costs', width=150, anchor=tk.CENTER) self.tree.column('total', width=100, anchor=tk.CENTER) self.tree.heading('ID', text='ID') self.tree.heading('description', text='Наименование') self.tree.heading('costs', text='Статья дохода|расхода') self.tree.heading('total', text='Сумма') self.tree.pack(side=tk.LEFT) scroll = tk.Scrollbar(self, command=self.tree.yview) scroll.pack(side=tk.LEFT, fill=tk.Y) self.tree.configure(yscrollcommand=scroll.set) elif (self.switch_present == 2): self.tree = ttk.Treeview(self, columns=('ID', 'nick_name', 'surename', 'name'), height=15, show='headings') self.tree.column('ID', width=30, anchor=tk.CENTER) self.tree.column('nick_name', width=365, anchor=tk.CENTER) self.tree.column('surename', width=150, anchor=tk.CENTER) self.tree.column('name', width=150, anchor=tk.CENTER) self.tree.heading('ID', text='ID') self.tree.heading('nick_name', text='Никнейм') self.tree.heading('surename', text='Фамилия') self.tree.heading('name', text='Имя') self.tree.pack(side=tk.LEFT) scroll = tk.Scrollbar(self, command=self.tree.yview) scroll.pack(side=tk.LEFT, fill=tk.Y) self.tree.configure(yscrollcommand=scroll.set) elif (self.switch_present == 3): self.tree = ttk.Treeview(self, columns=('ID', 'login', 'password'), height=15, show='headings') self.tree.column('ID', width=30, anchor=tk.CENTER) self.tree.column('login', width=300, anchor=tk.CENTER) self.tree.column('password', width=315, anchor=tk.CENTER) self.tree.heading('ID', text='ID') self.tree.heading('login', text='Логин') self.tree.heading('password', text='Пароль') self.tree.pack(side=tk.LEFT) scroll = tk.Scrollbar(self, command=self.tree.yview) scroll.pack(side=tk.LEFT, fill=tk.Y) self.tree.configure(yscrollcommand=scroll.set) if (self.switch_present == 4): self.tree = ttk.Treeview(self, columns=('ID', 'address', 'square', 'tel'), height=15, show='headings') self.tree.column('ID', width=30, anchor=tk.CENTER) self.tree.column('address', width=315, anchor=tk.CENTER) self.tree.column('square', width=100, anchor=tk.CENTER) self.tree.column('tel', width=200, anchor=tk.CENTER) self.tree.heading('ID', text='ID') self.tree.heading('address', text='Адрес') self.tree.heading('square', text='Площадь склада') self.tree.heading('tel', text='Телефон склада') self.tree.pack(side=tk.LEFT) scroll = tk.Scrollbar(self, command=self.tree.yview) scroll.pack(side=tk.LEFT, fill=tk.Y) self.tree.configure(yscrollcommand=scroll.set) # переключатель функций смены записей def records(self, description, costs, total): self.db.insert_data(description, costs, total) self.view_records() def view_records(self): self.db.cursor.execute("SELECT * FROM `main_bd`") [self.tree.delete(i) for i in self.tree.get_children()] # очищаем даныыея, чтобы обновить dictionary_rows = self.db.cursor.fetchall() dictionary_rows_lists = [] for position in dictionary_rows: dictionary_rows_list = [v for k, v in position.items()] # список кортежей dictionary_rows_lists.append(tuple(dictionary_rows_list)) '''Получили список кортежей из массива словарей из строк таблицы''' for row in dictionary_rows_lists: self.tree.insert('', 'end', values=row) def default_view_records(self): [self.tree.delete(i) for i in self.tree.get_children()] # очищаем даныыея, чтобы обновить dictionary_rows = self.db.cursor.fetchall() dictionary_rows_lists = [] for position in dictionary_rows: dictionary_rows_list = [v for k, v in position.items()] # список кортежей dictionary_rows_lists.append(tuple(dictionary_rows_list)) '''Получили список кортежей из массива словарей из строк таблицы''' for row in dictionary_rows_lists: self.tree.insert('', 'end', values=row) def update_records(self, description, costs, total): self.db.cursor.execute( "UPDATE `main_bd` SET description='{0}', costs='{1}' , total='{2}' WHERE ID='{3}'".format( description, costs, total, self.tree.set(self.tree.selection()[0], '#1'))) self.db.connection.commit() self.view_records() def delete_records(self): for selected in self.tree.selection(): self.db.cursor.execute( "DELETE FROM `main_bd` WHERE id='{0}'".format(self.tree.set(selected, '#1')) ) self.db.connection.commit() self.view_records() def search_records(self, description): description = '%' + description + '%' self.db.cursor.execute("SELECT * FROM `main_bd` WHERE description LIKE '{0}'".format(description)) [self.tree.delete(i) for i in self.tree.get_children()] # очищаем даныыея, чтобы обновить dictionary_rows = self.db.cursor.fetchall() dictionary_rows_lists = [] for position in dictionary_rows: dictionary_rows_list = [v for k, v in position.items()] # список кортежей dictionary_rows_lists.append(tuple(dictionary_rows_list)) '''Получили список кортежей из массива словарей из строк таблицы''' for row in dictionary_rows_lists: self.tree.insert('', 'end', values=row) def open_dialog(self): self.child = Child() def open_update_dialog(self): Update() def search_dialog(self): Search()
 

Dany_D

Новичок
Пользователь
Мар 29, 2021
7
0
1
class Child(tk.Toplevel): def __init__(self): super().__init__(root) self.init_child() self.view = app def init_child(self): self.title('Добавить доходы|расходы') self.geometry("527x350+415+300") self.resizable(False, False) lable_description = ttk.Label(self, text='Наименование') lable_description.place(x=50, y=50) lable_select = ttk.Label(self, text='Статья дохода|расхода') lable_select.place(x=50, y=80) lable_sum = ttk.Label(self, text='Сумма') lable_sum.place(x=50, y=110) self.entry_description = ttk.Entry(self) self.entry_description.place(x=200, y=50) self.combobox = ttk.Combobox(self, values=[u'Доход', u'Расход']) self.combobox.current(0) self.combobox.place(x=200, y=80) self.entry_money = ttk.Entry(self) self.entry_money.place(x=200, y=110) self.btn_cancel = ttk.Button(self, text='Закрыть', command=self.destroy) self.btn_cancel.place(x=300, y=170) self.btn_ok = ttk.Button(self, text='Добавить') self.btn_ok.place(x=220, y=170) self.btn_ok.bind('<Button-1>', lambda event: self.view.records(self.entry_description.get(), self.combobox.get(), self.entry_money.get())) # "INSERT INTO `main_bd` (description,costs,total) VALUES ('Patrik','Доход','1000');" self.grab_set() self.focus_set() class Update(Child): def __init__(self): super().__init__() self.init_edit() self.view = app self.db = db self.default_data() def init_edit(self): self.title('Редактировать позцию') btn_edit = ttk.Button(self, text='Редактировать') btn_edit.place(x=205, y=170) btn_edit.bind('<Button-1>', lambda event: self.view.update_records( self.entry_description.get(), self.combobox.get(), self.entry_money.get())) self.btn_ok.destroy() def default_data(self): self.db.cursor.execute( "SELECT * FROM `main_bd` WHERE id='{0}'".format(self.view.tree.set(self.view.tree.selection()[0], '#1'))) dictionary_row = self.db.cursor.fetchall() for position in dictionary_row: dictionary_rows_list = [v for k, v in position.items()] # список кортежей dictionary_rows_tuple = tuple(dictionary_rows_list) row = dictionary_rows_tuple self.entry_description.insert(0, row[1]) if row[2] != 'Доход': self.combobox.current(1) self.entry_money.insert(0, row[3]) class Search(tk.Toplevel): def __init__(self): super().__init__() self.init_search() self.view = app def init_search(self): self.title('Поиск по позиции') self.geometry("300x100+415+300") self.resizable(False, False) label_search = tk.Label(self, text='Поиск') label_search.place(x=50, y=20) self.entry_search = ttk.Entry(self) self.entry_search.place(x=105, y=20, width=150) btn_cancel = ttk.Button(self, text='Закрыть', command=self.destroy) btn_cancel.place(x=185, y=50) btn_search = ttk.Button(self, text='Поик') btn_search.place(x=105, y=50) btn_search.bind('<Button-1>', lambda event: self.view.search_records(self.entry_search.get())) btn_search.bind('<Button-1>', lambda event: self.destroy(), add='+') class DB: def __init__(self): self.connection = pymysql.connect( host=host, port=3306, user=user, password=password, database=db_name, cursorclass=pymysql.cursors.DictCursor ) self.cursor = self.connection.cursor() self.cursor.execute( # "DROP TABLE `main_bd`"AUTOINCREMENT INTEGER PRIMARY KEY "CREATE TABLE IF NOT EXISTS `main_bd` (id INT AUTO_INCREMENT PRIMARY KEY, description text,costs text, total real)" ) self.connection.commit() def insert_data(self, description, costs, total): self.cursor.execute( "INSERT INTO `main_bd` (description,costs,total) VALUES ('{0}','{1}','{2}');".format(description, costs, total) ) self.connection.commit() if __name__ == "__main__": root = tk.Tk() db = DB() app = Main(root) app.pack() root.title("Домашние финансы") root.geometry("665x500+300+200") root.resizable(False, False) root.mainloop()
 

Dany_D

Новичок
Пользователь
Мар 29, 2021
7
0
1
все отправить не получилось, но вот весь код.
там есть еще файл config, для подключения бд на локалхосте, но мне это не важно, очень хочется разобраться , чтобы работало переключение таблиц и кнопок.
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
КАК ты догадался так вставить?!

у тебя есть 2 строки:
[ CODE=python]

[ /CODE]

между ними надо вставить весь код
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
что вы подчеркнули на скрине, так он вставил...
Ага, каждую строчку отдельно
 

lynulx

Модератор
Команда форума
Модератор
Авг 9, 2020
139
19
18
Ага, каждую строчку отдельно
"однострочный код" и подчеркнули
 

Vershitel_sudeb

Vershitel sudeb
Команда форума
Модератор
Мар 17, 2021
933
208
43
20
Москва
"однострочный код" и подчеркнули
Сори, я позже заметил
 

Форум IT Специалистов