В вашем коде есть несколько ошибок.
Во-первых, вам нужно позвонить 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