Как открыть другой код, из окна tkinter

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
Нужно по нажатию на кнопку открывать другой код, который тоже будет с интерфейсом Tkinter.
Уже знаю что надо создать функцию и добавить кнопке команду на нее, а как через функцию запустит другой код не знаю. Какой библиотекой воспользоваться?
Python:
from tkinter import *

root = Tk()
root.title('Главная программа')

button1 = Button(text='Интегрирование', bg='green', fg='red', width=39) #  я знаю что здесь будет , command = Название функции
button2 = Button(text='Решение нелинейного уравнения /\nдифференциального уравнения', bg='pink', fg='cyan', width=39)
button3 = Button(text='Построение графика \nпараметрически заданной функции', bg='purple', fg='brown', width=39)
button4 = Button(text='Конструктор блок-схем', bg='cyan', fg='orange', width=39)

button1.pack()
button2.pack()
button3.pack()
button4.pack()
root.mainloop()
Win10
Python 3.8
Tkinter
 
  • Мне нравится
Реакции: Андрейlol

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
А можно как то реализовать так, что бы это были разные файлы?
Можно запускать другие скрипты с помощью os.system('путь_к_скрипту/имя_скрипта.py').
Python:
import tkinter as tk
import os

root = tk.Tk()
root.title('Главная программа')

frame_start = tk.Frame(root)

frame_start.pack()


button1 = tk.Button(master=frame_start, text='Интегрирование', bg='green', fg='red', width=39, command=lambda: os.system('script1.py')) #  я знаю что здесь будет , command = Название функции
button2 = tk.Button(master=frame_start, text='Решение нелинейного уравнения /\nдифференциального уравнения', bg='pink', fg='cyan', width=39, command=lambda: os.system('script2.py'))
button3 = tk.Button(master=frame_start, text='Построение графика \nпараметрически заданной функции', bg='purple', fg='brown', width=39, command=lambda: os.system('script3.py'))
button4 = tk.Button(master=frame_start, text='Конструктор блок-схем', bg='cyan', fg='orange', width=39, command=lambda: os.system('script4.py'))

button1.pack()
button2.pack()
button3.pack()
button4.pack()

root.mainloop()
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Можете, пожалуйста, объяснить что за lambda? Для чего она тут нужна, нельзя использовать просто _command=os.system('script1.py'))_?
Я так понимаю необходимо заменять 'script1.py' на путь к скрипту или я могу просто оставить название, если например они лежат в одной папке?
Если скрипты в одной папке - путь можно не указывать. lambda - это просто функция, в данном случае она нужна чтобы в команд передать вызов os.system аргументом 'script1.py'. Если делать без lambda, то вызов os.system произойдет на старте программы, а не по нажатию кнопки.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Буду рад, если еще подскажете как можно заметить импорт всего из Tkinter, импортируя только те функции которые используются только здесь
Вот простой пример на фреймах. На каждом фрейме можно размещать виджеты, нужно только указывать атрибут master чтобы они были привязаны к нужному фрейму (например, master=frame_1).
Python:
import tkinter as tk

root = tk.Tk()
root.title('Главная программа')

frame_start = tk.Frame(root)

frame_start.pack()


button1 = tk.Button(master=frame_start, text='Интегрирование', bg='green', fg='red', width=39, command=lambda: change_frame(1)) #  я знаю что здесь будет , command = Название функции
button2 = tk.Button(master=frame_start, text='Решение нелинейного уравнения /\nдифференциального уравнения', bg='pink', fg='cyan', width=39, command=lambda: change_frame(2))
button3 = tk.Button(master=frame_start, text='Построение графика \nпараметрически заданной функции', bg='purple', fg='brown', width=39, command=lambda: change_frame(3))
button4 = tk.Button(master=frame_start, text='Конструктор блок-схем', bg='cyan', fg='orange', width=39, command=lambda: change_frame(4))

button1.pack()
button2.pack()
button3.pack()
button4.pack()

# Интегрирование
frame_1 = tk.Frame(root)
label_1 = tk.Label(master=frame_1, text='Интегрирование')
button_1 = tk.Button(master=frame_1, text='Назад', command=lambda: back(1))
label_1.pack()
button_1.pack()

# Решение нелинейного уравнения /\nдифференциального уравнения
frame_2 = tk.Frame(root)
label_2 = tk.Label(master=frame_2, text='Решение нелинейного уравнения /\nдифференциального уравнения')
button_2 = tk.Button(master=frame_2, text='Назад', command=lambda: back(2))
label_2.pack()
button_2.pack()

# Построение графика \nпараметрически заданной функции
frame_3 = tk.Frame(root)
label_3 = tk.Label(master=frame_3, text='Построение графика \nпараметрически заданной функции')
button_3 = tk.Button(master=frame_3, text='Назад', command=lambda: back(3))
label_3.pack()
button_3.pack()

# Конструктор блок-схем
frame_4 = tk.Frame(root)
label_4 = tk.Label(master=frame_4, text='Конструктор блок-схем')
button_4 = tk.Button(master=frame_4, text='Назад', command=lambda: back(4))
label_4.pack()
button_4.pack()

# поменять фрейм
def change_frame(num):
    frame_start.forget()
    eval('frame_' + str(num)).pack()

# вернутся к стартовому фрейму
def back(num):
    eval('frame_' + str(num)).forget()
    frame_start.pack()


root.mainloop()
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Сделал все, как вы посоветовали, но при работе, после нажатия на кнопку, окно зависает больше не кликабельно, пока его не закроешь.Посмотреть вложение 77
Второе окно открывается и работает корректно. Как можно исправить проблему с первым? Либо не давать ему ломаться, либо пусть сразу после работы одной из кнопок закрывается.
Вот пример с закрытием первого окна:
Python:
import tkinter as tk
import os

root = tk.Tk()
root.title('Главная программа')

frame_start = tk.Frame(root)

frame_start.pack()


def func(script_name):
    root.destroy()
    os.system(script_name)


button1 = tk.Button(master=frame_start, text='Интегрирование', bg='green', fg='red', width=39, command=lambda: func('script1.py'))
button2 = tk.Button(master=frame_start, text='Решение нелинейного уравнения /\nдифференциального уравнения', bg='pink', fg='cyan', width=39, command=lambda: func('script2.py'))
button3 = tk.Button(master=frame_start, text='Построение графика \nпараметрически заданной функции', bg='purple', fg='brown', width=39, command=lambda: func('script3.py'))
button4 = tk.Button(master=frame_start, text='Конструктор блок-схем', bg='cyan', fg='orange', width=39, command=lambda: func('script4.py'))

button1.pack()
button2.pack()
button3.pack()
button4.pack()

root.mainloop()
 

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
Буду рад, если еще подскажете как можно заметить импорт всего из Tkinter, импортируя только те функции которые используются только здесь
 
  • Мне нравится
Реакции: Андрейlol

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
А можно как то реализовать так, что бы это были разные файлы?
 

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
Спасибо
 

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
Можете, пожалуйста, объяснить что за lambda? Для чего она тут нужна, нельзя использовать просто _command=os.system('script1.py'))_?
Я так понимаю необходимо заменять 'script1.py' на путь к скрипту или я могу просто оставить название, если например они лежат в одной папке?
 

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
Огромное спасибо за все ответы.
 

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
Сделал все, как вы посоветовали, но при работе, после нажатия на кнопку, окно зависает больше не кликабельно, пока его не закроешь.1587368403408.png
Второе окно открывается и работает корректно. Как можно исправить проблему с первым? Либо не давать ему ломаться, либо пусть сразу после работы одной из кнопок закрывается.
 

MrGeo

Новичок
Пользователь
Апр 19, 2020
22
3
3
Вот пример с закрытием первого окна:
Python:
import tkinter as tk
import os

root = tk.Tk()
root.title('Главная программа')

frame_start = tk.Frame(root)

frame_start.pack()


def func(script_name):
    root.destroy()
    os.system(script_name)


button1 = tk.Button(master=frame_start, text='Интегрирование', bg='green', fg='red', width=39, command=lambda: func('script1.py'))
button2 = tk.Button(master=frame_start, text='Решение нелинейного уравнения /\nдифференциального уравнения', bg='pink', fg='cyan', width=39, command=lambda: func('script2.py'))
button3 = tk.Button(master=frame_start, text='Построение графика \nпараметрически заданной функции', bg='purple', fg='brown', width=39, command=lambda: func('script3.py'))
button4 = tk.Button(master=frame_start, text='Конструктор блок-схем', bg='cyan', fg='orange', width=39, command=lambda: func('script4.py'))

button1.pack()
button2.pack()
button3.pack()
button4.pack()

root.mainloop()
Мда, сделал тоже самое, только думал что будет логичнне поставить сначала открытие программы, а потом закрытие этой и ничего не работало. Спасибо за помощь.
 

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