fedor
Ноя. 16, 2013 13:56:49
Здравствуйте.
Пытаюсь написать програмку считающую формулу по вводимым параметрам чисел. Столкнулся с проблемой что не выводятся окна ввода параметров. А именно для этого решил использовать однострочное текстовое поле. Но по какой-то причине оно не выводится и вообще подойдет оно для ввода чисел?. Подскажите что не так делаю. Заранее спасибо
(Python 2*)
# -*- coding: cp866 -*-
from Tkinter import *
window = Tk()
window.title(u'Оценка достоверности функционирования сетевого элемента телекоммуникационной сети')
label = Label(window, text = u'Оценка достоверности функционирования \n сетевого элемента телекоммуникационной сети')
label.config(fg = ‘blue’, font = ('Georgia', 8, ‘italic’))
label.pack()
class label1:
def __init__(self):
self.lab = Label (window, text = u'X=')
self.lab.config(fg = ‘red’, font = ('Georgia', 8, ‘italic’))
self.lab.pack()
obj = label1()
ent = Entry(window,width=20,bd=3)
class label2:
def __init__(self):
self.lab = Label (window, text = u'Y=')
self.lab.config(fg = ‘red’, font = ('Georgia', 8, ‘italic’))
self.lab.pack()
obj = label2()
ent = Entry(window,width=20,bd=3)
class label3:
def __init__(self):
self.lab = Label (window, text = u'Z=')
self.lab.config(fg = ‘red’, font = ('Georgia', 8, ‘italic’))
self.lab.pack()
obj = label3()
ent = Entry(window,width=20,bd=3)
class But1:
def __init__(self):
self.but = Button(window, text = u'Посчитать',width=10,height=1,bg=“white”,fg=“blue”, command = window.quit)
self.but.pack(expand=YES, fill=X)
obj = But1()
window.mainloop()
4kpt_II
Ноя. 16, 2013 14:22:57
По Вашему посту:
- Вы считаете, что размещать его не надо?
Теперь вообще:
1. Оберните код в теги. Сложно разобраться с отступами.
2. Код не очень. Уберите class, если не знаете, как им в событийных системах пользоваться. На первых порах можно и без него. Это нормально.
3. Неверно и так уже не пишут
Правильно будет так.
4. Эту инструкцию использовать нельзя.
Могу дать ссылку пост, где я это подробно описывал. Даже с кучей примеров и кучей пояснений.
5. Не нужно так делать. Этот механизм предназначен для другого…
6. И самое незначительное. Принято корневое окно называть root
Будут вопросы, пишите.
fedor
Ноя. 16, 2013 15:43:52
# coding: utf-8
from Tkinter import *
root = Tk()
root.title(u'Оценка достоверности функционирования сетевого элемента телекоммуникационной сети')
label = Label(root, text = u'Оценка достоверности функционирования \n сетевого элемента телекоммуникационной сети')
label.config(fg = 'blue', font = ('Georgia', 8, 'italic'))
label.pack()
label1 = Label (root, text = u'X=')
label1.config(fg = 'red', font = ('Georgia', 8, 'italic'))
label1.pack()
ent = Entry(root,width=20,bd=3)
label2 = Label (root, text = u'Y=')
label2.config(fg = 'red', font = ('Georgia', 8, 'italic'))
label2.pack()
ent = Entry(root,width=20,bd=3)
label3 = Label (root, text = u'Z=')
label3.config(fg = 'red', font = ('Georgia', 8, 'italic'))
label3.pack()
ent = Entry(root,width=20,bd=3)
button = Button(root, text = u'Посчитать',width=10,height=1,bg="white",fg="blue", command = root.quit)
button.pack(expand=YES, fill=X)
root.mainloop()
Да канечно же ссылки буду не лишними, обязательно прочту
4kpt_II
Ноя. 16, 2013 17:16:39
Ссылка на тему
Смотрите с серединыДалее. По Вашему вопросу. Я же уже ответил.
# coding: utf-8
import Tkinter
import tkFont
#
def quit():
root.destroy()
#
root = Tkinter.Tk()
root.title(u'Оценка достоверности функционирования сетевого элемента телекоммуникационной сети')
fnt = tkFont.Font(family='Georgia', size=8, slant='italic') # Соберите шрифт один раз...
#
label = Tkinter.Label(root, text=u'Оценка достоверности функционирования \n сетевого элемента телекоммуникационной сети', fg='blue', font=fnt)
label.pack()
label1 = Tkinter.Label(root, text=u'X=', fg='red', font=fnt)
label1.pack()
ent_x = Tkinter.Entry(root, width=20, bd=3)
ent_x.pack() #Забыли упаковать этот виджет
#
label2 = Tkinter.Label (root, text=u'Y=', fg='red', font=fnt)
label2.pack()
ent_y = Tkinter.Entry(root, width=20, bd=3)
ent_y.pack()
#
label3 = Tkinter.Label(root, text=u'Z=', fg='red', font=fnt)
label3.pack() #И этот...
ent_z = Tkinter.Entry(root, width=20, bd=3)
ent_z.pack() #Вот этот тоже выводиться не будет :)
#
button = Tkinter.Button(root, text=u'Посчитать', width=10, height=1, bg="white", fg="blue", command=quit)
button.pack(expand=True, fill="x")
#
root.mainloop()
P.S. Забыл сказать. Еще.
Это не закрытие окна. Это вывод окна из цикла обработки событий. Вывести он его вывел. А вот закрывать не планирует, так как Вы ему не дали по этому окну четких указаний
Поэтому лушче делать так, как я написал выше.
Будут вопросы - пишите.
fedor
Ноя. 16, 2013 17:31:28
Спасибо большое за ответ, все доходчиво. По подключению библиотеки tkinter как было ранее внял из прочитанного по ссылке.
Можно уточнить ещё несколько вопросов?
что нам дает импорт tkFont и def quit?
import tkFont
#
def quit():
root.destroy()
И получается каждое действие необходимо паковать?
4kpt_II
Ноя. 16, 2013 17:46:32
1. Импорт tkFont дает вам возможность в пространстве выполнения создавать шрифты и самостоятельно их настраивать. И потом использовать их короткие записи для назначения этих шрифтов нужным виджетам.
Мне кажеться, что
менее засирает код, чем
font = ('Georgia', 8, 'italic')
Мало того, если в коде изменится параметры шрифта fnt, то это автоматом влияет на все виджеты, к которым он привязан. Хороший такой бонус
2. Действия паковать не надо. Но на них нужно писать обработчик. Иначе реакции Вы не получите. Я создал реакцию виджета button на стандартные вызовы. При появлении нужного события на нужном виджете (событие Button-1 или space) вызывается функция quit в которой убивается корневое окно. Хотя в этой функции могло бы быть все, что угодно: рассчеты, изменения параметров существующих виджетов, создание новых, открытие и закрытие файлов и …..
3. Необходимо вызывать менеджер геометрии объектов для каждого виджета, т.е. как Вы выражаетесь, “паковать”.
Их существует 3: pack(), place(), grid().
Будут вопросы - пишите.
fedor
Ноя. 16, 2013 17:59:21
1.С бонусом согласен
2.Усвоил, я так и собираюсь потом написать действие кнопки к вычислению функции и выводу графика
3.grid() если не ошибаюсь дает возможность выстраивать объекты в пространстве?
ent_x.grid(row=0,column=0)
4kpt_II
Ноя. 16, 2013 18:07:53
Все менеджеры геометрии объектов служат для размещения виджетов в пространстве. Подходы только разные. Единственное, что нужно помнить: два разных менеджера на одном виджете работать не будут. Чтобы это реализовать нужно для каждого менеджера создавать свою рамку (Tkinter.Frame). И рамки с размещенными объектами уже размещать на базовом виджете.
Будут вопросы - пишите.