использование классов для создания флажков в tktinter python - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь использовать классы для создания нескольких флажков в tktinter python, но по какой-то причине флажки не отображаются, это ошибка, которую я получаю AttributeError: 'crop' object has no attribute 'tk' И вот мой код

from tkinter import *
from tkinter.ttk import *
import tkinter as tk  # python 3
screen = Tk()

class crop:

    def __init__(self,sizename,sizevar,onvar):
        sizevar= StringVar
        self.tk.Checkbutton(screen, text=sizename, variable=sizevar, onvalue=onvar, offvalue='no')
        self.pack()


def main():
    first = crop('2.5','twofive','twofiveon')
    second = crop('3','three','threeon')
screen.mainloop()    
main()

заранее благодарим за помощь.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

В вашем коде есть несколько ошибок.

Во-первых, вам нужно позвонить mainloop после того, как вы позвоните main, а не раньше.

Во-вторых, sizevar= StringVar необходимо be sizevar= StringVar().

Третий - и это строка, которая вызывает ошибку - вы пытаетесь вызвать self.tk.Checkbutton, но ваш объект crop не определил атрибут с именем tk . Я не совсем уверен, что вы пытаетесь выполнить sh, но я предполагаю, что вы просто пытаетесь вызвать контрольную кнопку tk, что означает, что код должен быть tk.Checkbutton(...)

Следующая проблема связана с self.pack() - self - это объект crop. Это не виджет, поэтому у него нет метода pack. Похоже, вы намерены упаковать контрольную кнопку, поэтому вам нужно сохранить ссылку на контрольную кнопку, а затем вызвать на ней pack (например: self.cb = tk.Checkbutton(...); self.cb.pack())

Другая проблема заключается в том, что вы импортируете tkinter дважды. Вы должны сделать это только один раз. Вам нужно удалить как from tkinter import *, так и from tkinter.ttk import *. Затем используйте tk. или ttk. в качестве префикса при обращении к объектам tkinter и ttk.

Последняя проблема заключается в том, что вы не следуете рекомендациям PEP8 , что усложняет ваш код для понимания других программистов. В частности, crop должен быть Crop.

Собирая все вместе, ваш код должен 1 выглядеть так:

import tkinter as tk
from tkinter import ttk

screen = tk.Tk()

class Crop:

    def __init__(self,sizename,sizevar,onvar):
        sizevar= tk.StringVar()
        self.cb = tk.Checkbutton(screen, text=sizename, variable=sizevar, onvalue=onvar, offvalue='no')
        self.cb.pack()


def main():
    first = Crop('2.5','twofive','twofiveon')
    second = Crop('3','three','threeon')

main()
screen.mainloop()

1 Я говорю должен , потому что не на 100% понятно, что вы хотите делать. Из-за того, как вы изначально выполняли импорт, неясно, собираетесь ли вы использовать ttk-версию виджета Checkbutton или tk-версию. Это одна из причин, по которой импорт подстановочных знаков плох при импорте tkinter. Если вы хотите использовать контрольную кнопку ttk, вам нужно изменить эту строку на эту:

self.cb = ttk.Checkbutton
0 голосов
/ 08 мая 2020

Вам нужно сделать что-то вроде:

  def __init__(self,sizename,sizevar,onvar):
        global screen # or pass it as __init__ parameter
        sizevar= StringVar
        b= tk.Checkbutton(screen, text=sizename, variable=sizevar, onvalue=onvar, offvalue='no')
        b.pack()
...