Уведомления

Группа в Telegram: @pythonsu

#1 Июль 24, 2018 16:13:10

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Баг в Tkinter?

Код ниже просто выводит 100 строк на tk.Canvas (он выбран потому, что в дальнейшем нужны tk.Scrollbar). Он нормально отрабатывает в Linux, но в Windows (удаленка, виртуалка, wine), если я использую yview_scroll на tk.Canvas (см. Bug.bindings), то видимыми остаются только либо 2 строчки сверху, либо снизу, см:

В чем проблема?

 #!/usr/bin/python3
import tkinter as tk
class Bug:
    
    def __init__(self,parent):
        self.parent = parent
        self.gui()
        
    def move_up(self,event=None,value=-1):
        self.cvs.yview_scroll(value,'units')
        
    def move_down(self,event=None,value=1):
        self.cvs.yview_scroll(value,'units')
    
    def bindings(self):
        self.parent.bind('<Down>',self.move_down)
        self.parent.bind('<Up>',self.move_up)
    
    def gui(self):
        self.frames()
        self.widgets()
        self.bindings()
        
    def frames(self):
        self.frm1 = tk.Frame(self.parent)
        self.frm1.pack(expand=1)
    
    def widgets(self):
        self.cvs = tk.Canvas(self.frm1)
        self.cvs.pack()
        self.lbl = tk.Label(self.frm1)
        self.lbl.pack(expand=1)
        self.cvs.create_window(0,0,window=self.lbl)
        
    def add_row(self,text):
        frm = tk.Frame(self.lbl)
        frm.pack()
        cbox = tk.Checkbutton(frm)
        cbox.pack(side='left')
        lbl = tk.Label(frm)
        lbl.config(text=text)
        lbl.pack(side='left')
    
    def fill(self):
        for i in range(100):
            self.add_row('Row %d' % i)
            
    def region (self,x=0,y=0
               ,x_border=0,y_border=0
               ):
        # Both integer and float values are allowed at input
        if x and y:
            self.cvs.configure (scrollregion = (-x/2 - x_border
                                               ,-y/2 - y_border
                                               , x/2 + x_border
                                               , y/2 + y_border
                                               )
                               )
        else:
            print('Empty input is not allowed!')
    
    def scroll(self,event=None,x=0,y=0):
        self.cvs.xview_moveto(x)
        self.cvs.yview_moveto(y)
if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('400x300')
    bug = Bug(root)
    bug.fill()
    bug.region (x        = 400
               ,y        = 2050
               ,x_border = 5
               ,y_border = 20
               )
    bug.scroll()
    root.wait_window()
    root.mainloop()

Отредактировано vanvanov (Июль 24, 2018 16:14:56)

Офлайн

#2 Июль 24, 2018 17:03:27

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Баг в Tkinter?

Возможно, это проблема видеодрайверов. Другого ПК с виндой нет. Если запустите код на своей машине и опишите результат - буду благодарен.

Офлайн

#3 Июль 25, 2018 10:59:08

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Баг в Tkinter?

vanvanov
Возможно, это проблема видеодрайверов. Другого ПК с виндой нет. Если запустите код на своей машине и опишите результат - буду благодарен.
да, нет таже фигня, при скроле, или два сверху или два снизу, если мышкой поводить по окну, то если мшка наезжает на чекбокс, чекбокс появляется, лейблы остаються невидимыми..



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#4 Авг. 8, 2018 03:26:58

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Баг в Tkinter?

В общем, баг кроется где-то в порте tk.Label для Windows. Придется в похожих случаях использовать tk.Frame вместо tk.Label, тогда все работает. К сожалению, win-порт оставляет желать лучшего - это уже не первый случай, когда кроссплатформенный код работает по-разному. Например, в другой программе в Windows фокус оказывался не на том виджете, как того хотелось и как то работало в Linux. Выяснилось, что до этого выполнялось label.update(), и когда оно было заменено на root.update_idletasks(), то все стало работать.

Офлайн

#5 Авг. 14, 2018 15:39:30

DamMercul
Зарегистрирован: 2017-11-26
Сообщения: 323
Репутация: +  13  -
Профиль   Отправить e-mail  

Баг в Tkinter?

Делай .update() на каждый элемент затрагивающийся, или на элементы с одним мастером



____________________________________________________

 # Life loop
while alive:
    if (fun > boredom) and money:
        pass_day(fun, boredom, money)
        continue
    else: break

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version