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

Как передать "фокус" дочернего окна над главным ?

24.10.2021, 17:29. Показов 3971. Ответов 5

Студворк — интернет-сервис помощи студентам
Пишу программу для работы с БД. Есть два класса: класс главного окна, с кнопкой открытия дочернего окна, и класс дочернего окна с остальным функционалом. Нужно сделать так, чтобы я мог взаимодействовать с главным окном после отработки дочернего окна. Т.е не мог закрыть главное окно, нажимать на его кнопки и т.д, пока открыто дочернее окно. Читал про .grab_set() .focus_set() и .wait_window() но принципа их взаимодействия с классами так и не понял. Заранее спасибо за ответы
код:
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
from tkinter import *
from tkinter import messagebox
import psycopg2
 
is_conn = False
#Entry только чисел
class Lotfi(Entry):
    def __init__(self, master=None, **kwargs):
        self.var = StringVar()
        Entry.__init__(self, master, textvariable=self.var, **kwargs)
        self.old_value = ''
        self.var.trace('w', self.check)
        self.get, self.set = self.var.get, self.var.set
 
    def check(self, *args):
        if self.get().isdigit():
            # the current value is only digits; allow this
            self.old_value = self.get()
        else:
            # there's non-digit characters in the input; reject this
            self.set(self.old_value)
# класс главного окна
class main:
    def __init__(self, master):
        self.master = master
        self.master.title('Программа')
        self.master.geometry('550x550+300+225')
        self.master.resizable(True, False)
        self.connection_button = Button(self.master, text='Подключение', command=lambda: child(self.master))
        self.connection_button.grid(row=0, column=0, stick='we')
 
        self.master.mainloop()
 
 
# класс дочернего окна
class child:
    def __init__(self, master):
        self.slave = Toplevel(master)
        self.slave.title('Подключение к БД')
        self.slave.geometry('250x250+300+225')
        self.slave.resizable(False, False)
 
        # лэйблы ввода
        self.host_label = Label(self.slave, text='Host').grid(row=0, column=0, stick='w')
        self.database_label = Label(self.slave, text='Database').grid(row=1, column=0, stick='w')
        self.user_label = Label(self.slave, text='User').grid(row=2, column=0, stick='w')
        self.password_label = Label(self.slave, text='Password').grid(row=3, column=0, stick='w')
        self.port_label = Label(self.slave, text='Port').grid(row=4, column=0, stick='w')
 
        self.host_en = Entry(self.slave, width=30)
        self.host_en.grid(row=0, column=1)
        self.database_en = Entry(self.slave, width=30)
        self.database_en.grid(row=1, column=1)
        self.user_en = Entry(self.slave, width=30)
        self.user_en.grid(row=2, column=1)
        self.password_en = Entry(self.slave, width=30, show='*')
        self.password_en.grid(row=3, column=1)
        self.port_en = Lotfi(self.slave, width=30)
        self.port_en.grid(row=4, column=1)
        self.bnt_conn = Button(self.slave, text='Подключение', command=self.connection_to_db).grid(row=5, column=0, columnspan=2,
                                                                                   pady=10)
    def connection_to_db(self):
        global is_conn
        try:
            conn = psycopg2.connect(
                host=f"{self.host_en.get()}",
                database=f"{self.database_en.get()}",
                user=f"{self.user_en.get()}",
                password=f"{self.password_en.get()}",
                port=f"{int(self.port_en.get())}",
            )
            is_conn = True
            c = conn.cursor()
            if is_conn:
                messagebox.showinfo(title='Успешно', message='Успешное подключение к БД')
 
        except psycopg2.OperationalError:
            messagebox.showerror(title='Ошибка', message=f'{psycopg2.OperationalError}')
 
        self.host_en.delete(0, END)
        self.database_en.delete(0, END)
        self.user_en.delete(0, END)
        self.password_en.delete(0, END)
        self.port_en.delete(0, END)
        if is_conn:
            self.slave.destroy()
 
 
 
# создание окна
root = Tk()
 
# запуск окна
main(root)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.10.2021, 17:29
Ответы с готовыми решениями:

Как передать данные из дочернего окна?
Как из дочернего окна передать данные формы родительскому окну? В этом форуме рассматривались варианты с обновлением родительского окна,...

Как передать значение переменной из дочернего окна родительскому
Открываю дочернее окно и нужно оттуда получить значение переменных и вывести в родительском как это можно реализовать ? var newWindow...

Как при создании дочернего окна передать ему указатель на static-переменную в оконной процедуре родительского?
Есть оконная процедура родительского окна, в ней есть static-переменная, например, static std::string s;. Оконная процедура дочернего кона...

5
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
24.10.2021, 17:50
QDialog
http://itnotesblog.ru/note.php?id=230
0
25.10.2021, 08:13

Не по теме:

vic5710, tkinter

0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
25.10.2021, 11:30
Лучший ответ Сообщение было отмечено dimasikkarasiq как решение

Решение

ну так как то

Добавлено через 43 секунды
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from tkinter import Tk, Toplevel, Button, Label
 
 
def func():
    top = Toplevel(root)
    button_top_level = Button(top, text='Нажми', command=lambda: label.config(text='Текст из модального окна')).pack()
    top.transient(root)
    top.grab_set()
    top.focus_set()
    top.wait_window()
 
 
root = Tk()
label = Label(root, text='Текст')
label.pack()
button = Button(root, text='openModal', command=func).pack()
root.mainloop()
1
0 / 0 / 0
Регистрация: 06.05.2020
Сообщений: 10
25.10.2021, 14:33  [ТС]
Так и есть, догнал до этого сам чуть позже создания темы с вопросом) Я вставлял строчки эти заветные три строчки в начале, т.е даже до объявления размера окна и прочего.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
25.10.2021, 22:05
dimasikkarasiq, попробовал - в моем понимании модальность это -
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from PyQt5 import Qt
class W(Qt.QWidget):
    def __init__(self):
        super().__init__()
        btn = Qt.QPushButton('Click',self)
        btn.move(100,100)
        btn.clicked.connect(self.on_click)
        
    def on_click(self):
        d = Qt.QInputDialog()
        ret = d.exec_()
        print(ret)
 
if __name__=="__main__":
    app = Qt.QApplication([])
    w = W()
    w.show()
    app.exec_()
тут от дочернего окна к родителю вообще никак не переключишься

Добавлено через 7 минут
https://github.com/py-ilya/Tki... ndow_09.py
тут разве что фокус есть, да и то yesno только
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.10.2021, 22:05
Помогаю со студенческими работами здесь

Проблема с отрисовкой дочернего окна над окном с DirectX
У меня есть родительское окно в котором я инициализировал DirectX11 и просто рисую зеленый фон. И есть дочернее окно но оно не...

Как уменьшить пространство над верхним горизонтальным главным меню?
Здравствуйте, Я хочу немного сдвинуть вверх мой сайт в браузере или, иными словами, уменьшить пространство над верхним горизонтальным...

Как получить размеры клиентской области окна-родителя в функции дочернего окна?
задание такое: имеется дочернее окно,которое "убегает" от курсора мыши в пределах родительского окна. я создала главное окно,и дочернее,...

При открытии дочернего окна, отображаются формы и кнопки с основного окна; как исправить?
при открытии дочернего окна, отображаются формы и кнопки с основного окна, как можно исправить? ...

Невидимый блок над главным меню
Всем привет, есть сайт i-took.ru на dle, адаптивный шаблон, шаблон переделываю под себя, но возникла проблема с которой не могу справиться,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru