Уведомления

Группа в Telegram: @pythonsu

#1 Май 16, 2019 17:55:00

linkington3
Зарегистрирован: 2019-05-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

python tkinter виджет

Мне нужно сделать виджет, который будет считать и выводить слева от виджета ввода текста номер строки(как в sublime text и ему подобных). Сам мучаюсь уже вторую неделю. Надеюсь на вашу помощь. Надо б встроить код данного виджета в мой(не очень мой).

код на python 3.7

 import tkinter
from tkinter.filedialog import asksaveasfile, askopenfile
from tkinter.messagebox import showerror
import easygui
FILE_NAME = tkinter.NONE
def credit():
    easygui.msgbox(
        " You can save files with buttons Save and Save As \n You can open files with button Open \n You can create new file with button New File")
def new_file():
    global FILE_NAME
    FILE_NAME = "Untitled"
    text.delete('1.0', tkinter.END)
def save_file():
    data = text.get('1.0', tkinter.END)
    out = open(FILE_NAME, 'w')
    out.write(data)
    out.close()
def save_as():
    out = asksaveasfile(mode='w', defaultextension='.txt')
    data = text.get('1.0', tkinter.END)
    try:
        out.write(data.rstrip())
    except Exception:
        showerror(title="Oops!", message="Unable to save file....")
def open_file():
    global FILE_NAME
    inp = askopenfile(mode="r")
    if inp is None:
        return
    FILE_NAME = inp.name
    data = inp.read()
    text.delete('1.0', tkinter.END)
    text.insert('1.0', data)
root = tkinter.Tk()
root.title("2Text")
root.geometry("600x400")
root.minsize(width=600, height=400)
menuBar = tkinter.Menu(root)
fileMenu = tkinter.Menu(menuBar)
menuBar.add_command(label="New", command=new_file)
menuBar.add_command(label="Open", command=open_file)
menuBar.add_command(label="Save", command=save_file)
menuBar.add_command(label="Save As", command=save_as)
menuBar.add_command(label="Exit", command=root.quit)
menuBar.add_command(label="Credits & Info", command=credit)
root.config(menu=menuBar)
text = tkinter.Text(root, width=400, height=400)
text.pack()
root.mainloop()

Отредактировано linkington3 (Май 16, 2019 18:22:02)

Офлайн

#2 Май 17, 2019 12:39:38

BOBAH
Зарегистрирован: 2019-02-17
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

python tkinter виджет

Не знаю насколько это велосипед, но можно:
создать label в нужном месте,
сунуть в отдельный поток цикл, который через каждые, например 0.1 с. считывает весь текст с твоего текстового виджета, подсчитывает кол-во \n и с помощью label.config(text = ‘Новый текст’) - изменяет значение label.
Примерный код такого “безобразия”, только закрытие процесса в случае выхода не реализовано:

 import tkinter
from threading import Thread
from time import sleep
class MyWindow(tkinter.Tk):
    def __init__(self):
        super().__init__()
        self._create_widgets()
        Thread(target=self._update).start()
    def _create_widgets(self):
        self.entry_text = tkinter.Text()
        self.entry_text.pack()
        self.label_pos_cursor = tkinter.Label(text='0')
        self.label_pos_cursor.pack(side=tkinter.BOTTOM, anchor='w')
    def _update(self):
        while True:
            text = self.entry_text.get('1.0', tkinter.END)
            allusion = text.count('\n')
            self.label_pos_cursor.config(text=allusion)
            sleep(0.1)
if __name__ == '__main__':
    root = MyWindow()
    root.mainloop()

Офлайн

#3 Май 17, 2019 22:50:56

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

python tkinter виджет

BOBAH
унуть в отдельный поток цикл, который через каждые, например 0.1 с. считывает весь текст с твоего текстового виджета, подсчитывает кол-во \n и с помощью label.config(text = ‘Новый текст’) - изменяет значение label.
Примерный код такого “безобразия”, только закрытие процесса в случае выхода не реализовано:
Это не велосипед, это медведь на велосипеде который крутит педали костылями. Ткинтер событийно ориентированоый модуль, и этим нужно пользоваться.

linkington3 не вы первый задаетесь этим вопросом и все уже украдено придумано до нас. Посмотрите тут https://stackoverflow.com/questions/16369470/tkinter-adding-line-number-to-text-widget
по ходу то что нужно.



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

Отредактировано PEHDOM (Май 17, 2019 22:51:34)

Офлайн

#4 Май 19, 2019 07:03:29

BOBAH
Зарегистрирован: 2019-02-17
Сообщения: 38
Репутация: +  0  -
Профиль   Отправить e-mail  

python tkinter виджет

PEHDOM
Это не велосипед, это медведь на велосипеде который крутит педали костылями
Точно сказано

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version