Отключить виджет с помощью кнопки? - PullRequest
3 голосов
/ 25 мая 2011

Как я могу отключить запись с помощью кнопки ... я получил это, но это не работает (python 2.7.1) ...

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

from Tkinter import *

root = Tk()

class Principal(tk.Tk):
    def __init__(self, *args, **kwargs):

        foo = ""    
        nac = ""

        global ck1
        nac = IntVar()      
        ck1 = Checkbutton(root, text='Test',variable=nac, command=self.naccheck)
        ck1.pack()

        global ent
        ent = Entry(root, width = 20, background = 'white', textvariable = foo, state = DISABLED)       
        ent.pack()

    def naccheck(self):
        if nac == 1:
            ent.configure(state='disabled')
        else:
            ent.configure(state='normal')       

app=Principal()
root.mainloop()

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

В вашем коде много неправильных вещей. Например, Principle наследуется от tk.Tk, но вы не импортируете Tkinter под именем tk.

Во-вторых, вам не нужны глобальные переменные. Вместо этого вы должны использовать переменные экземпляра.

В-третьих, поскольку nac - это IntVar, вам нужно использовать метод get для получения значения.

Наконец, вы используете foo в качестве значения атрибута textvariable, но вы используете обычное значение. Это должна быть переменная Tk (например: StringVar)

Вот версия вашего кода с исправленными вещами:

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

import Tkinter as tk

root = tk.Tk()

class Principal(tk.Tk):
    def __init__(self, *args, **kwargs):

        self.foo = tk.StringVar()
        self.nac = tk.IntVar()      
        ck1 = tk.Checkbutton(root, text='Test',variable=self.nac, command=self.naccheck)
        ck1.pack()

        self.ent = tk.Entry(root, width = 20, background = 'white', 
                            textvariable = self.foo, state = tk.DISABLED)       
        self.ent.pack()

    def naccheck(self):
        if self.nac.get() == 1:
            self.ent.configure(state='disabled')
        else:
            self.ent.configure(state='normal')       

app=Principal()
root.mainloop()

Кстати, будь ты from Tkinter import * или import Tkinter as tk - дело стиля. Мне нравится последний, потому что он не оставляет сомнений в том, какой модуль содержит имя класса или константу. Выполнение import * может вызвать проблемы, если вы импортируете что-то с именем, которое конфликтует с другим кодом в вашем файле.

2 голосов
/ 26 мая 2011

Я сделал переменную члена foo и nac класса Principal

    ...
    self.foo = StringVar()
    self.foo.set("test")
    self.nac = IntVar()
    ...

Затем в naccheck () ссылка на self.nac

    def naccheck(self):
        if self.nac == 1:
            ent.configure(state='disabled')
            self.nac = 0
        else:
            ent.configure(state='normal')
            self.nac = 1

Не забудьте изменить переменную ck1 = self.nac и ent's textvariable = self.foo.

Кроме того, вы можете захотеть сделать переменные-члены ck1 и ent, так как у вас могут возникнуть проблемы с ссылками на них позже с помощью naccheck ()

Эти изменения отлично работали на моем Python2.7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...