Форум сайта python.su
разбираюсь с tkinter-om:
1) сделал дочерние окна по кнопке,
2) потом случайную покраску окон
3) и, чтобы на родительское окно не наезжали.
4) и вот захотел я их посчитать.
И не тут-то было.
отчего-то дают 1, 3, 7, 15, 31…
(в 1-м примере ниже я добавил 1-ку, чтобы были чистые степени двойки: 2,4,8,16,32….)
Там тупо глобальная переменная counter.
Не хочет, ну, думаю, глобальные переменные не по феншую,
сделаю в классе - но результат тот же (во 2-м):
(во 2-м оставил 1, 3, 7, 15, 31…)
Не могу понять отчего так? (почему не 1,2,3,4,5,6,7…..) ?
файлы в виде файлов прилагаются.
1-й
# -*- coding: utf-8 -*- # импортирование модулей python from tkinter import * # класс главного окна class main(): def __init__(self, master): self.master = master self.master.title('parent') self.master.geometry('200x150+300+225') self.button = Button(self.master, text = 'myButton', command = self.openDialog, font="Arial 24") self.button.pack(side = BOTTOM) self.master.mainloop() def openDialog(self): child(self.master) # класс дочерних окон counter = 0 class child(): def __init__(self, master): self.slave = Toplevel(master) self.slave.title('child') global counter counter += counter + 1 self.label = Label(self.slave, text = ('Окно N '+str(counter+1)), font="Arial 16") #self.label = Label(self.slave, text = 'Привет, мир') #self.label.pack(padx = 0, pady = 0) self.label.pack(side = TOP) geometry1 = str(random.randrange(0,100)) geometry2 = str(random.randrange(400,700)) geometry11 = str(random.randrange(0,100)) geometry22 = str(random.randrange(400,700)) g1 = random.choice([geometry1,geometry2]) g2 = random.choice([geometry11,geometry22]) # geometry0 = '+'+geometry1+'+'+geometry2 geometry0 = '+'+g1+'+'+g2 geo = '200x150'+geometry0 #self.slave.geometry('200x150+500+375') self.slave.geometry(geo) bgcolor = random.choice(colors) self.slave.configure(bg=bgcolor) #self.slave.configure(bg='green') #root.configure(bg='green') import random colors = ['red','yellow', 'green', 'orange', 'aqua', 'blue', 'fuchsia', 'maroon', 'pink', 'purple', 'lime', 'violet', 'cyan', 'cornflowerblue', 'indigo', 'chartreuse' ] # bgcolor = random.choice(colors) # создание окна root = Tk() # запуск окна main(root)
# -*- coding: utf-8 -*- # импортирование модулей python from tkinter import * # класс главного окна class main: count = 0 def __init__(self, master): self.master = master self.master.title('parent') self.master.geometry('200x150+300+225') self.button = Button(self.master, text = 'myButton', command = self.openDialog, font="Arial 20") self.button.pack(side = BOTTOM) self.master.mainloop() def openDialog(self): self.count += self.count + 1 child.counter = self.count print("child.counter = ", child.counter) child(self.master) # класс дочерних окон class child: def __init__(self, master): self.slave = Toplevel(master) self.slave.title('child') #self.counter += self.counter + 1 self.label = Label(self.slave, text = ('Окно N '+str(self.counter)), font="Arial 18") #self.label = Label(self.slave, text = 'Привет, мир') #self.label.pack(padx = 0, pady = 0) self.label.pack(side = TOP) geometry1 = str(random.randrange(0,100)) geometry2 = str(random.randrange(400,700)) geometry11 = str(random.randrange(0,100)) geometry22 = str(random.randrange(400,700)) g1 = random.choice([geometry1,geometry2]) g2 = random.choice([geometry11,geometry22]) # geometry0 = '+'+geometry1+'+'+geometry2 geometry0 = '+'+g1+'+'+g2 geo = '200x150'+geometry0 #self.slave.geometry('200x150+500+375') self.slave.geometry(geo) bgcolor = random.choice(colors) self.slave.configure(bg=bgcolor) #self.slave.configure(bg='green') #root.configure(bg='green') import random colors = ['red','yellow', 'green', 'orange', 'aqua', 'blue', 'fuchsia', 'maroon', 'pink', 'purple', 'lime', 'violet', 'cyan', 'cornflowerblue', 'indigo', 'chartreuse' ] # bgcolor = random.choice(colors) # создание окна root = Tk() # запуск окна main(root) """ child.counter 1 child.counter 3 child.counter 7 child.counter 15 child.counter 31 child.counter 63 child.counter 127 child.counter 255 child.counter 511 child.counter 1023 child.counter 2047 child.counter 4095 """
Прикреплённый файлы:
tkinter_child.7z (1,1 KБ)
Офлайн
А что это за беспредел:
self.count += self.count + 1
self.count += 1
Офлайн
Ну точно! Спасибо, добрый человек!
как я сел в лужу…
и та же бодяга с 1-м вариантом.
Вспомнил - писал я counter +=
тут меня отвлекают, потом я возвращаюсь, и вуаля - дописываю не глядя counter + 1. Это феерически.
А потом ту же строку скопировал в self……
Надо завершать транзакции!!!! Напишу себе над монитором.
Да, tkinter здесь ни причем, я его подло оклеветал, каюсь, посыпаю голову пеплом (от дискеты) :-)
Офлайн
Ткинтер тут есть, но зачем использовать counter этот тупой когда можно сделать массив child'ов и к нему обращаться, или словарь если надо по const'ам неизменяемым обращаться, так гораздо умнее будет.
p.s. PEP 8, конечно, не идеал, но ТАКОЙ код даже самый богатый транжира-работодатель на фрилансе не пощрит
# Life loop while alive: if (fun > boredom) and money: pass_day(fun, boredom, money) continue else: break
Офлайн