Найти - Пользователи
Полная версия: tkinter посчитать кол-во дочерних окон - степени двойки вместо нормы
Начало » GUI » tkinter посчитать кол-во дочерних окон - степени двойки вместо нормы
1
Florenzo
разбираюсь с 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
"""

rami
А что это за беспредел:
 self.count += self.count + 1

должно быть:
 self.count += 1
каждый раз надо прибавлять единицу, а не паровоз с прицепами


А где здесь tkinter?
Florenzo
Ну точно! Спасибо, добрый человек!
как я сел в лужу…

и та же бодяга с 1-м вариантом.

Вспомнил - писал я counter +=
тут меня отвлекают, потом я возвращаюсь, и вуаля - дописываю не глядя counter + 1. Это феерически.
А потом ту же строку скопировал в self……

Надо завершать транзакции!!!! Напишу себе над монитором.

Да, tkinter здесь ни причем, я его подло оклеветал, каюсь, посыпаю голову пеплом (от дискеты) :-)

DamMercul
Ткинтер тут есть, но зачем использовать counter этот тупой когда можно сделать массив child'ов и к нему обращаться, или словарь если надо по const'ам неизменяемым обращаться, так гораздо умнее будет.

p.s. PEP 8, конечно, не идеал, но ТАКОЙ код даже самый богатый транжира-работодатель на фрилансе не пощрит
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB